Linus Groh
38ba13e912
LibJS: Implement Object.is()
...
Basically === with two particularities: comparing NaN to itself is
considered equal and comparing +0 and -0 is not.
2020-04-26 13:53:05 +02:00
Andreas Kling
35aea2e454
LibJS: Stop using Optional<Value> in favor of Value's empty state
...
JS::Value already has the empty state ({} or Value() gives you one.)
Use this instead of wrapping Value in Optional in some places.
I've also added Value::value_or(Value) so you can easily provide a
fallback value when one is not present.
2020-04-25 18:45:22 +02:00
Kesse Jones
838127df35
LibJS: Add String.prototype.includes
2020-04-25 16:54:25 +02:00
Kesse Jones
b0ca174d49
LibJS: Add Array.prototype.find
2020-04-24 17:10:19 +02:00
Linus Groh
95b51e857d
LibJS: Add TokenType::TemplateLiteral
...
This is required for template literals - we're not quite there yet, but at
least the parser can now tell us when this token is encountered -
currently this yields "Unexpected token Invalid". Not really helpful.
The character is a "backtick", but as we already have
TokenType::{StringLiteral,RegexLiteral} this seemed like a fitting name.
This also enables syntax highlighting for template literals in the js
REPL and LibGUI's JSSyntaxHighlighter.
2020-04-24 11:18:57 +02:00
Linus Groh
57caca3171
LibJS: Fix ObjectExpression::execute()
...
Change from code review changed key() and value() getters - forgot to
update this...
2020-04-24 00:02:07 +02:00
Linus Groh
746dd5b190
LibJS: Implement computed properties in object expressions
2020-04-23 23:56:04 +02:00
Linus Groh
bebd5c097c
LibJS: Require colon in object expression for non-identifier keys
...
{foo} is valid - {"foo"} or {1} is not.
2020-04-23 23:56:04 +02:00
Linus Groh
402ba20c36
LibJS: Fix left shift operator
...
Typo causing it to compute lhs << lhs, not lhs << rhs as expected.
2020-04-23 23:48:27 +02:00
Linus Groh
11728b7db5
LibJS: Implement 'in' operator
2020-04-23 19:38:13 +02:00
Linus Groh
396ecfa2d7
LibJS: Implement bitwise unsigned right shift operator (>>>)
2020-04-23 19:38:13 +02:00
Linus Groh
502d1f5165
LibJS: Implement bitwise right shift operator (>>)
2020-04-23 19:38:13 +02:00
Linus Groh
f0e7404480
LibJS: Implement bitwise left shift operator (<<)
2020-04-23 19:38:13 +02:00
Linus Groh
97366f4dd4
LibJS: Add Math.pow()
2020-04-23 19:38:13 +02:00
Kesse Jones
687096cadd
LibJS: Add Array.prototype.includes
2020-04-23 19:30:16 +02:00
Kesse Jones
6d308113b8
LibJS: Fix Array.prototype.indexOf fromIndex negative
...
If negative fromIndex considers displacement from the end of the array
without decreasing 1 of de size.
2020-04-23 11:06:10 +02:00
Linus Groh
7540203ae8
LibJS: Add isFinite()
2020-04-23 11:03:42 +02:00
Linus Groh
8ff2881b1a
LibJS: Let isNaN() with no argument return true, add tests
2020-04-23 11:03:42 +02:00
Linus Groh
418092a71a
LibJS: Implement Array length setter
2020-04-23 09:47:23 +02:00
Linus Groh
a1b820b11c
LibJS: Improve UpdateExpression::execute()
...
- Let undefined variables throw a ReferenceError by using
Identifier::execute() rather than doing variable lookup manually and
ASSERT()ing
- Coerce value to number rather than ASSERT()ing
- Make code DRY
- Add tests
2020-04-22 13:09:59 +02:00
Kesse Jones
b2305cb67d
LibJS: Add Array.prototype.lastIndexOf
2020-04-22 13:08:00 +02:00
Linus Groh
038051d205
LibJS: Parse while statements
2020-04-22 11:48:14 +02:00
Andreas Kling
627fd6374b
LibJS: Add Uint8ClampedArray :^)
...
This is a special kind of byte array that clamps its values to 0...255
It will be used for HTML ImageData objects.
I made Object::put_by_index() and get_by_index() virtual for this.
We'll probably need to make non-numeric property name lookups virtual
as well, but this solves my current problem well enough.
2020-04-21 23:47:39 +02:00
Jack Karamanian
1fa0c7304d
LibJS: Implement Function.prototype.bind()
2020-04-21 12:23:07 +02:00
Jack Karamanian
b3800829da
LibJS: Prepend callee's bound arguments to the CallFrame and set the
...
this_value to the callee's bound |this| in CallExpression::execute()
2020-04-21 12:23:07 +02:00
Jack Karamanian
5750edd859
LibJS: Allow Function objects to be constructed with a bound |this|
...
value and bound arguments
This allows Function objects produced by Function.prototype.bind, as well
as arrow functions to track their |this| values and bound arguments.
2020-04-21 12:23:07 +02:00
Linus Groh
13f806b1b0
LibJS: Rename global_call_fram to global_call_frame
...
Seems to be a typo.
2020-04-21 09:43:56 +02:00
Linus Groh
9722cac9fe
LibJS: Let run-tests return 1 when not all tests pass
2020-04-20 22:44:13 +02:00
Andreas Kling
f78a92c5a9
LibJS: Remove default parameter from assertThrowsError() for now
...
We don't support these yet, and it broke all the tests. :^)
2020-04-20 20:33:21 +02:00
Linus Groh
cff68af965
LibJS: Add JSDoc to test-common.js
2020-04-20 17:31:49 +02:00
Kesse Jones
df6696f576
LibJS: Add Array.prototype.reverse
2020-04-20 17:26:46 +02:00
Kesse Jones
579975fd1e
LibJS: Add Array.prototype.indexOf
2020-04-20 11:55:18 +02:00
Linus Groh
d3e3f5b421
LibJS: Add tests for String.prototype.repeat()
2020-04-20 11:41:25 +02:00
Linus Groh
a893c6ff0d
LibJS: Throw RangeError in String.prototype.repeat() if count is invalid
2020-04-20 11:41:25 +02:00
Linus Groh
0718f216af
LibJS: Add assertThrowsError() test function
2020-04-20 11:38:01 +02:00
AnotherTest
992467cca3
LibJS: Do not assume that a call frame exists in {get,set}_variable
2020-04-19 17:36:37 +02:00
Andreas Kling
69566bd4d6
LibJS: Allow passing "js" flags to run-tests
...
This allows us to run "run-tests -g" for testing with GC after every
heap allocation. This may flush out bugs that would otherwise not
occur if GC'ing only occasionally.
2020-04-19 17:34:33 +02:00
Andreas Kling
f7a1696087
LibJS: Add MarkedValueList and use it for argument passing
...
A MarkedValueList is basically a Vector<JS::Value> that registers with
the Heap and makes sure that the stored values don't get GC'd.
Before this change, we were unsafely keeping Vector<JS::Value> in some
places, which is out-of-reach for the live reference finding logic
since Vector puts its elements on the heap by default.
We now pass all the JavaScript tests even when running with "js -g",
which does a GC on every heap allocation.
2020-04-19 17:34:33 +02:00
Andreas Kling
afdba94f63
LibJS: Fix expectations in the function-TypeError.js test
...
They now match the new, more verbose error messages.
2020-04-19 14:51:47 +02:00
Andreas Kling
b251091a6a
LibJS: CallExpression shouldn't throw TypeError or non-constructor call
...
This unbreaks the entire test suite. :^)
2020-04-19 14:51:47 +02:00
Andreas Kling
2a9e29fbb8
LibJS: Add DeferGC, a RAII way to prevent GC temporarily
2020-04-19 12:09:32 +02:00
Linus Groh
03f2024b6e
LibJS: Improve CallExpression::execute()'s error messages
2020-04-19 11:00:39 +02:00
Kesse Jones
856ab9c600
LibJS: Add Array.prototype.slice
2020-04-19 02:09:06 +02:00
Linus Groh
71d6459b7f
LibJS: Use AK::String::index_of() for StringPrototype::index_of()
2020-04-18 22:24:22 +02:00
Stephan Unverwerth
bf5b251684
LibJS: Allow reserved words as keys in object expressions.
2020-04-18 22:23:20 +02:00
Stephan Unverwerth
cebb619f8e
LibJS: Fix parsing of IfStatement, fixes #1829
2020-04-18 14:04:24 +02:00
Andreas Kling
3072f9fd82
LibJS: Move the empty object shape from Interpreter to GlobalObject
...
The big remaining hurdle before a GlobalObject-agnostic Interpreter is
the fact that Interpreter owns and vends the GlobalObject :^)
2020-04-18 13:59:20 +02:00
Andreas Kling
fca08bd000
LibJS: Move builtin prototypes to the global object
...
This moves us towards being able to run JavaScript in different global
objects without allocating a separate GC heap.
2020-04-18 13:24:45 +02:00
Linus Groh
d14ddb6461
LibJS: Implement nullish coalescing operator (??)
2020-04-18 12:34:13 +02:00
Andreas Kling
30de1f610d
LibJS: Use enumerator macro to mark all constructors in GlobalObject
...
We were forgetting to mark the String constructor! So this patch fixes
that and ensures we won't forget anyone in the future.
2020-04-18 11:02:05 +02:00