Andreas Kling
0cbbf6f5eb
LibJS: Add a tiny little test for the ReferenceError exception
2020-03-28 10:27:48 +01:00
Andreas Kling
0d2fb306af
LibJS: Check for exceptions in a lot more places
2020-03-27 15:36:00 +01:00
Andreas Kling
6a5cd32205
LibJS: The global isNaN() should coerce to number before testing NaN
...
For stricter NaN checking, we'll have to implement Number.isNaN().
2020-03-27 12:59:41 +01:00
Andreas Kling
c60dc84a33
LibJS: Allow function calls with missing arguments
...
We were interpreting "undefined" as a variable lookup failure in some
cases and throwing a ReferenceError exception instead of treating it
as the valid value "undefined".
This patch wraps the result of variable lookup in Optional<>, which
allows us to only throw ReferenceError when lookup actually fails.
2020-03-27 12:56:05 +01:00
Andreas Kling
04ced9e24a
LibJS: Add global isNaN() function
2020-03-27 12:45:36 +01:00
Andreas Kling
9a78b4af2c
LibJS: Basic NaN support
...
This patch adds js_nan() for constructing a NaN value. You can check
if a Value is NaN with Value::is_nan().
2020-03-27 12:40:22 +01:00
Andreas Kling
9494865f99
LibJS: Actually pop frames off of the scope stack when exiting a scope
2020-03-27 11:34:58 +01:00
Andreas Kling
4802413f71
LibJS: Say "return {}" instead of "return js_undefined()" in AST nodes
...
This looks a bit nicer somehow.
2020-03-26 12:36:52 +01:00
Andreas Kling
ad6ede7ee4
LibJS: Make FunctionDeclaration return undefined
...
FunctionExpression returns a JS::Function, while FunctionDeclaration
declares one in the relevant scope.
2020-03-26 12:27:15 +01:00
Andreas Kling
68dec2801d
LibJS: Add Object::own_properties() convenience accessor
2020-03-26 12:19:01 +01:00
Andreas Kling
d7073b9f3e
LibJS: Add Value::is_array()
2020-03-26 12:02:18 +01:00
Andreas Kling
6c9d2cfa5e
LibJS: Handle "for" statements with empty initializer and updater
2020-03-25 16:14:51 +01:00
Andreas Kling
30d24af54a
LibJS: Add a basic test for the "throw" keyword
2020-03-25 16:09:23 +01:00
Andreas Kling
9e8d3d6287
LibJS: Rename some tests
...
"feature-basic" is a bit more logical than having a ton of
"basic-feature" (when it comes to the visual overview of it all.)
2020-03-25 15:57:18 +01:00
Andreas Kling
78923d986e
LibJS: Tweak run-tests output a bit
2020-03-25 15:52:17 +01:00
Andreas Kling
45488401b1
LibJS: Add a very basic test runner (shell script) + some tests
2020-03-25 15:32:17 +01:00
Andreas Kling
a94a150df0
LibJS: Remove unnecessary space character at the end of console.log()
2020-03-25 14:08:47 +01:00
Andreas Kling
9ee7142227
LibJS: Fix parsing of if (typeof "foo" === "string")
...
Move parsing of unary expressions into the primary expression parsing
step so that `typeof` takes precedence over `===` in the above example.
2020-03-25 09:51:54 +01:00
Andreas Kling
7a5ef0a87f
LibJS: Disable HEAP_DEBUG logging on non-SerenityOS platforms
...
This makes it a bit easier to work with LibJS on Linux for now.
2020-03-25 09:49:14 +01:00
Andreas Kling
faddf3a1db
LibJS: Implement "throw"
...
You can now throw an expression to the nearest catcher! :^)
To support throwing arbitrary values, I added an Exception class that
sits as a wrapper around whatever is thrown. In the future it will be
a logical place to store a call stack.
2020-03-24 22:21:58 +01:00
Andreas Kling
db024a9cb1
LibJS: Remove debug spam in Error.prototype.name
2020-03-24 22:21:58 +01:00
Andreas Kling
7dc78b5e38
LibJS: Use correct |this| value when getting/setting native properties
2020-03-24 16:14:10 +01:00
Andreas Kling
343e224aa8
LibJS: Implement basic exception throwing
...
You can now throw exceptions by calling Interpreter::throw_exception().
Anyone who calls ASTNode::execute() needs to check afterwards if the
Interpreter now has an exception(), and if so, stop what they're doing
and simply return.
When catching an exception, we'll first execute the CatchClause node
if present. After that, we'll execute the finalizer block if present.
This is unlikely to be completely correct, but it's a start! :^)
2020-03-24 16:14:10 +01:00
Andreas Kling
c33d4aefc3
LibJS: Parse "try", "catch" and "finally"
...
This is the first step towards support exceptions. :^)
2020-03-24 16:14:10 +01:00
Andreas Kling
494df52961
LibJS: Actually leave the current function scope on "return"
...
We now unwind until the nearest function-level scope on the scope stack
when executing a return statement.
2020-03-23 19:22:24 +01:00
Andreas Kling
df524203b2
LibJS: Consume semicolon at the end of a statement
...
A bunch of code was relying on this not happenind, in particular the
parsing of "for" statements. Reorganized things so they work again.
2020-03-23 19:10:18 +01:00
Andreas Kling
fbb9e1b715
LibJS: Implement "else" parsing
...
We can now handle scripts with if/else in LibJS. Most of the changes
are about fixing IfStatement to store the consequent and alternate node
as Statements.
Interpreter now also runs Statements, rather than running ScopeNodes.
2020-03-23 16:52:58 +01:00
Andreas Kling
b2f005125d
LibJS: Always collect all garbage when destroying Heap
...
When the Heap is going down, it's our last chance to run destructors,
so add a separate collector mode where we simply skip over the marking
phase and go directly to sweeping. This causes everything to get swept
and all live cells get destroyed.
This way, valgrind reports 0 leaks on exit. :^)
2020-03-23 14:11:19 +01:00
Andreas Kling
6dc4b23e2f
LibJS: Teach the lexer to recognize ">=" and "<=" :^)
2020-03-23 14:10:23 +01:00
Andreas Kling
1dd71bd68f
LibJS: Put some more Heap debug logging behind HEAP_DEBUG
2020-03-23 13:45:01 +01:00
Andreas Kling
79e065f0a2
LibJS: Port garbage collector to Linux
...
Well that was easy. LibJS can now run on Linux :^)
2020-03-23 13:14:57 +01:00
Andreas Kling
538537dfd0
LibJS: Use rand() for Math.random() on other systems
...
I bet we could be smarter here and use arc4random() on systems where
it is present. I'm not sure how to detect it though.
2020-03-23 13:14:04 +01:00
Andreas Kling
cccbe43056
LibJS: Use FlyString for identifiers
...
This makes variable and property lookups a lot faster since comparing
two FlyStrings is O(1).
2020-03-22 13:03:43 +01:00
Andreas Kling
7c48c3c8e1
LibJS: Parse "if" statements
...
This patch implements basic parsing of "if" statements. We don't yet
support parsing "else", so I added a FIXME about that.
2020-03-21 18:40:17 +01:00
Andreas Kling
8b18674229
LibJS: Add Math.random() :^)
2020-03-21 17:52:12 +01:00
Andreas Kling
08b17d70af
LibJS+LibWeb: Fix some inconsistencies in NativeFunction callbacks
...
These should always pass the arguments in a const Vector<JS::Value>&.
2020-03-21 14:43:44 +01:00
Andreas Kling
324b92fd06
LibJS: Virtualize access to an Object's own properties
...
Object now has virtual get_own_property() and put_own_property() member
functions that can be overridden to provide custom behavior.
We use these virtuals to move Array-specific access behavior to Array.
2020-03-21 14:37:34 +01:00
Andreas Kling
2a7dbac0c5
LibJS: Include the cell size in HeapBlock mmap names
...
HeapBlocks now show up in SystemMonitor as "LibJS: HeapBlock(32)" :^)
2020-03-21 13:12:16 +01:00
Andreas Kling
00feef8642
LibJS: Some optimizations for ObjectExpression
...
- move() the property map when constructing ObjectExpression instead of
making a copy.
- Use key+value iterators to traverse the property map in the execute()
and dump() functions.
2020-03-21 13:11:51 +01:00
Andreas Kling
6c3afca686
LibJS: Round cell sizes up to a multiple of 16 bytes
...
This increases HeapBlock utilization significantly (and reduces overall
memory usage.)
2020-03-21 11:49:18 +01:00
Andreas Kling
2106dafd62
LibJS: Delete fully-empty HeapBlocks after garbage collection
...
We now deallocate GC blocks when they are found to have no live cells
inside them.
2020-03-21 11:46:47 +01:00
0xtechnobabble
bc002f807a
LibJS: Parse object expressions
2020-03-21 10:08:58 +01:00
Andreas Kling
bceabd7c4b
LibJS: Add ArrayPrototype and implement Array.prototype.push()
...
This function is ultimately supposed to be generic and allow any |this|
that has a length property, but for now it only works on our own Array
object type.
2020-03-20 21:56:40 +01:00
Andreas Kling
8f7d4f67a4
LibJS: Support reading/writing elements in an Array via Object get/put
...
I'm not completely thrilled about Object::get() and Object::put() doing
special-case stuff for arrays, and we should probably come up with a
better abstraction for it.
But at least it works for now, which is really nice. :^)
2020-03-20 21:56:40 +01:00
Andreas Kling
a3d2e07446
LibJS: Parse computed MemberExpressions
...
MemberExpression comes in two flavors:
computed: a[b]
non-computed: a.b
We can now parse both of the types. :^)
2020-03-20 21:56:40 +01:00
Andreas Kling
86642add2f
LibJS: Allow default-constructing a JS::Value (undefined)
2020-03-20 21:56:40 +01:00
Andreas Kling
a82f64d3d6
LibJS: Parse ArrayExpression and start implementing Array objects
...
Note that property lookup is not functional yet.
2020-03-20 21:56:40 +01:00
Andreas Kling
5db8940c9e
LibJS: Use StringBuilder::join()
2020-03-20 14:41:23 +01:00
Andreas Kling
218f082226
LibJS: Print a newline in each console.log()
2020-03-20 14:41:23 +01:00
Andreas Kling
73d28a0551
LibJS: Prefer FunctionDeclaration if a statement begins with "function"
2020-03-19 18:07:07 +01:00