Leon Albrecht
c6ce7c9326
LibJS: Seal Bytecode Blocks and munmap them ( #7919 )
2021-06-08 17:21:48 +02:00
Idan Horowitz
064ed8279e
LibJS: Support deleting local variables with operator delete
...
To make this cleaner i also moved the logic into Reference::delete_.
2021-06-08 15:31:46 +01:00
Idan Horowitz
af58779def
LibJS: Return undefined from a with statement if no value was generated
...
Co-authored-by: Linus Groh <mail@linusgroh.de>
2021-06-08 15:31:46 +01:00
Idan Horowitz
98897ff676
LibJS: Return the last value from a with statement
2021-06-08 15:31:46 +01:00
Linus Groh
68ce69db88
LibJS: Add for loop bytecode generation
2021-06-08 11:59:32 +02:00
Gunnar Beutner
50ece3dd1b
LibJS: Implement bytecode generation for BigInts
2021-06-08 10:57:28 +01:00
Gunnar Beutner
0975e08285
LibJS: Make if yield undefined for the else branch if it is missing
2021-06-08 11:38:48 +02:00
Gunnar Beutner
d9989fd259
LibJS: Remove redundant jump for IfStatements
2021-06-08 11:38:48 +02:00
Gunnar Beutner
ef83872f62
LibJS: Make JumpIf{True,False,Nullish} inherit from Jump
...
This saves a few lines in LogicalExpression::generate_bytecode.
2021-06-08 11:38:48 +02:00
Luke
1dc31842cb
LibJS: Add sequence expression bytecode generation
2021-06-08 11:20:10 +02:00
Luke
de3ee701ce
LibJS: Add conditional expression bytecode generation
...
Or, by its more common name, the ternary operator :^)
2021-06-08 09:53:56 +01:00
Gunnar Beutner
6da587b59b
LibJS: Implement bytecode ops for logical expressions
2021-06-08 10:42:45 +02:00
Gunnar Beutner
216d27d4c1
LibJS: Convert values to boolean for JumpIfTrue/JumpIfFalse
...
Value::as_bool() might fail if the underlying value isn't already a
boolean value.
2021-06-08 10:42:45 +02:00
Idan Horowitz
aefb7995f1
LibJS: Add the Symbol.species getter to the appropriate built-ins
2021-06-08 09:09:51 +01:00
Linus Groh
39c3aefe5d
LibJS: Use to_property_key() a bunch in ReflectObject
...
Yay for correctness. :^)
2021-06-07 23:11:08 +01:00
Linus Groh
7565bf0590
LibJS: Remove redundant exception checks
2021-06-07 23:09:06 +01:00
Linus Groh
3fdad563e2
LibJS: Never omit setter/getter attributes in accessor descriptor object
...
These should not be omitted, an accessor with out getter or setter still
yields an undefined for the attribute in its descriptor object.
2021-06-07 23:07:13 +01:00
Linus Groh
8c964ef9f8
LibJS: Fix get_own_property_descriptor_object() field name order
...
This is defined by the spec: enumerable and configurable come last.
2021-06-07 23:02:52 +01:00
Linus Groh
4e555fae22
LibJS: Add missing cyclic prototype check to Object.setPrototypeOf()
2021-06-07 22:56:16 +01:00
Andreas Kling
ebb40e7d7b
LibJS: Use macros to generate the common unary/binary bytecode ops
2021-06-07 23:20:48 +02:00
Linus Groh
e0a2c1544f
LibJS: Fix whitespace errors in ASTCodegen.cpp
2021-06-07 21:19:12 +01:00
Linus Groh
9c0d83d11d
LibJS: Add bytecode generation for BinaryOp::InstanceOf
2021-06-07 21:18:35 +01:00
Linus Groh
5e996de8c6
LibJS: Add bytecode generation for BinaryOp::In
2021-06-07 21:18:35 +01:00
Gunnar Beutner
93eae063a1
LibJS: Make sure that if expressions yield the correct value
...
When evaluated as an expression "if (true) { 3 } else { 5 }"
should yield 3. This updates the bytecode interpreter to make
it so.
2021-06-07 22:10:57 +02:00
Gunnar Beutner
2c10bd72f2
LibJS: Make sure scope expressions yield the correct value
...
When evaluated as an expression "{ 3 }" should yield 3. This updates
the bytecode interpreter to make it so.
2021-06-07 22:10:57 +02:00
Ryan Chandler
6612e026ba
LibJS: Add <<, >> and >>> assignment operators
2021-06-07 21:23:11 +02:00
Luke
1e10965e61
LibJS: Add bytecode ops for <<, >> and >>>
2021-06-07 21:18:34 +02:00
Ryan Chandler
6681415f58
LibJS: Add support for various assignment operators
2021-06-07 21:18:19 +02:00
Ryan Chandler
18ac7fde12
LibJS: Add support for typed equality checks
2021-06-07 21:17:29 +02:00
Gunnar Beutner
9e69ffc1b1
LibJS: Add bytecode generation for EmptyStatement
2021-06-07 20:06:46 +01:00
Linus Groh
2b8a2542a0
LibJS: Add bytecode generation for DebuggerStatement
...
No-op. :^)
2021-06-07 20:05:50 +01:00
Linus Groh
fa9bad912e
LibJS: Add bytecode instructions for a bunch of unary operators
...
~, !, +, -, typeof, and void.
2021-06-07 19:53:47 +01:00
Linus Groh
54fc7079c6
LibJS: Remove redundant Value() from bytecode bitwise ops execute()
2021-06-07 19:53:22 +01:00
Gunnar Beutner
8ed5b7dcfa
LibJS: Add bytecode ops for loading boolean and null values
2021-06-07 20:26:45 +02:00
Ryan Chandler
6e2b266534
LibJS: Fix AbstractInequals returning result of AbstractEquals
2021-06-07 20:25:56 +02:00
Luke
ae763f1ade
LibJS: Add bytecode ops for &, | and ^
2021-06-07 20:17:24 +02:00
Gunnar Beutner
4be3374b24
LibJS: Add bytecode ops for >, >= and <=
2021-06-07 20:09:23 +02:00
Gunnar Beutner
55f0791b13
LibJS: Add bytecode instructions for modulo and exponentiation
2021-06-07 19:40:27 +02:00
Gunnar Beutner
3c5ce9b5b7
LibJS: Add bytecode instructions for multiplication and division
2021-06-07 19:21:36 +02:00
Andreas Kling
4776c50d5f
LibJS: Remove unused Bytecode::Block::m_buffer_end
2021-06-07 18:30:39 +02:00
Andreas Kling
312297ac38
LibJS: Add placeholder bytecode block sealing mechanism
...
After compiling bytecode, we should mark the memory read-only.
This currently does not work because it breaks instruction destruction.
I'm adding this anyway with a FIXME so we don't forget about it. :^)
2021-06-07 18:11:59 +02:00
Andreas Kling
4ba2eb8fe5
LibJS: Cache generated bytecode for ScriptFunction
...
It's silly to generate new bytecode every time you call a function.
Let's just cache the code instead. :^)
2021-06-07 18:11:59 +02:00
Andreas Kling
7cbe4daa7c
LibJS: Move bytecode debug spam behind JS_BYTECODE_DEBUG :^)
2021-06-07 18:11:59 +02:00
Andreas Kling
e7d69c5d3c
LibJS: Devirtualize and pack the bytecode stream :^)
...
This patch changes the LibJS bytecode to be a stream of instructions
packed one-after-the-other in contiguous memory, instead of a vector
of OwnPtr<Instruction>. This should be a lot more cache-friendly. :^)
Instructions are also devirtualized and instead have a type field
using a new Instruction::Type enum.
To iterate over a bytecode stream, one must now use
Bytecode::InstructionStreamIterator.
2021-06-07 18:11:59 +02:00
Andreas Kling
845f2826aa
LibJS: Reset Bytecode::Interpreter's m_return_value when leaving run()
...
Otherwise it will cause complete unwind since all parent run() loops
will see the same m_return_value being non-empty and break out.
2021-06-07 18:11:59 +02:00
Andreas Kling
9330163b0b
LibJS: Make sure the global CallFrame doesn't go out of scope
...
The Bytecode::Interpreter will push a global call frame if needed,
and it needs to make sure that call frame survives until the end
of the Interpreter::run() function.
2021-06-07 18:11:59 +02:00
Andreas Kling
0cc9d47e1b
LibJS: Add AbstractEquals bytecode instruction for == comparison :^)
2021-06-07 18:11:59 +02:00
Andreas Kling
4bdfe73895
LibJS: Add basic support for "continue" in the bytecode VM
...
Unlike the convoluted unwind-until-scope-type mechanism in the AST
interpreter, "continue" maps to a simple Bytecode::Op::Jump here. :^)
We know where to jump based on a stack of "continuable scopes" that
we now maintain on the Bytecode::Generator as we go.
Note that this only supports bare "continue", not continue-with-label.
2021-06-07 18:11:59 +02:00
Andreas Kling
79eac08f5b
LibJS: Add basic "if" statement support to the bytecode VM :^)
...
This also required making Bytecode::Op::Jump support lazy linking
to a target label.
I left a FIXME here about having the "if" statement return the result
value from the taken branch statement. That's what the AST interpreter
does but I'm not sure if it's actually required.
2021-06-07 18:11:59 +02:00
Andreas Kling
80b1604b0a
LibJS: Compile ScriptFunctions into bytecode and run them that way :^)
...
If there's a current Bytecode::Interpreter in action, ScriptFunction
will now compile itself into bytecode and execute in that context.
This patch also adds the Return bytecode instruction so that we can
actually return values from called functions. :^)
Return values are propagated from callee to caller via the caller's
$0 register. Bytecode::Interpreter now keeps a stack of register
"windows". These are not very efficient, but it should be pretty
straightforward to convert them to e.g a sliding register window
architecture later on.
This is pretty dang cool! :^)
2021-06-07 18:11:59 +02:00