1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 10:08:12 +00:00
serenity/Userland/Libraries/LibJS
Linus Groh c499239137 LibJS: Implement non-value-producing statements properly
For various statements the spec states:

    Return NormalCompletion(empty).

In those cases we have been returning undefined so far, which is
incorrect.

In other cases it states:

    Return Completion(UpdateEmpty(stmtCompletion, undefined)).

Which essentially means a statement is evaluated and its completion
value returned if non-empty, and undefined otherwise.

While not actually noticeable in normal scripts as the VM's "last value"
can't be accessed from JS code directly (with the exception of eval(),
see below), it provided an inconsistent experience in the REPL:

    > if (true) 42;
    42
    > if (true) { 42; }
    undefined

This also fixes the case where eval() would return undefined if the last
executed statement is not a value-producing one:

    eval("1;;;;;")
    eval("1;{}")
    eval("1;var a;")

As a consequence of the changes outlined above, these now all correctly
return 1.

See https://tc39.es/ecma262/#sec-block-runtime-semantics-evaluation,
"NOTE 2".

Fixes #3609.
2021-03-16 10:08:07 +01:00
..
Heap Userland: Remove superfluous headers 2021-03-11 12:32:53 +01:00
Runtime LibJS: Throw SyntaxError in eval() when parser has error(s) 2021-03-15 22:43:27 +01:00
Tests LibJS: Implement non-value-producing statements properly 2021-03-16 10:08:07 +01:00
AST.cpp LibJS: Implement non-value-producing statements properly 2021-03-16 10:08:07 +01:00
AST.h LibJS: Implement non-value-producing statements properly 2021-03-16 10:08:07 +01:00
CMakeLists.txt LibSyntax+LibGUI+LibJS: Move JS syntax highlighter to LibJS 2021-02-07 16:56:02 +01:00
Console.cpp LibJS: Put console dbgln() logging behind #ifdef __serenity__ 2021-03-02 08:36:34 +01:00
Console.h LibJS: Print console.{debug,error,info,log,warn} to system debug log 2021-02-21 21:32:16 +01:00
Forward.h LibJS: Implement the GetMethod abstract operation 2021-03-02 19:20:29 +01:00
Interpreter.cpp LibJS: Implement non-value-producing statements properly 2021-03-16 10:08:07 +01:00
Interpreter.h LibJS: Make Interpreter::run() a void function 2021-03-16 10:08:07 +01:00
Lexer.cpp LibJS: Keep track of file names, lines and columns inside the AST 2021-03-01 11:14:36 +01:00
Lexer.h LibJS: Keep track of file names, lines and columns inside the AST 2021-03-01 11:14:36 +01:00
MarkupGenerator.cpp Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
MarkupGenerator.h Libraries: Move to Userland/Libraries/ 2021-01-12 12:17:46 +01:00
Parser.cpp LibJS: Keep track of file names, lines and columns inside the AST 2021-03-01 11:14:36 +01:00
Parser.h LibJS: Keep track of file names, lines and columns inside the AST 2021-03-01 11:14:36 +01:00
SourceRange.h LibJS: Keep track of file names, lines and columns inside the AST 2021-03-01 11:14:36 +01:00
SyntaxHighlighter.cpp LibSyntax: Make rehighlight() take Gfx::Palette as by const-reference 2021-02-11 23:52:39 +01:00
SyntaxHighlighter.h LibSyntax: Make rehighlight() take Gfx::Palette as by const-reference 2021-02-11 23:52:39 +01:00
Token.cpp Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
Token.h LibJS: Keep track of file names, lines and columns inside the AST 2021-03-01 11:14:36 +01:00