1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 08:58:11 +00:00
Commit graph

6528 commits

Author SHA1 Message Date
Andreas Kling
a2a8b97c11 LibJS: Simplify MemberExpression::generate_bytecode()
Use the get-from-reference helper in BytecodeGenerator.
2021-10-25 16:04:31 +02:00
Andreas Kling
72cd31d033 LibJS: Tweak Value::to_property_key() fast path for Int32
Move the check for Int32 *before* we call to_primitive().
2021-10-25 15:37:28 +02:00
Andreas Kling
cfbb69a9cd LibJS: Support more assignment expressions in the bytecode VM
Use the new reference get/put helpers in BytecodeGenerator to support
assignment expressions other than just plain assignment.
2021-10-25 15:29:52 +02:00
Andreas Kling
72736f9e93 LibJS: Generate bytecode for UpdateExpression with MemberExpression arg 2021-10-25 15:17:41 +02:00
Andreas Kling
1dc60b028f LibJS: Add BytecodeGenerator helpers for reference get/put
This allows code sharing between all AST nodes that want to get and/or
put through a reference.
2021-10-25 15:16:22 +02:00
Andreas Kling
b63d17e2f8 LibJS: Add fast paths for <, >, <=, and >= with Int32 on both sides
This gives us a ~5% speed-up on Kraken's ai-astar.js
2021-10-25 14:35:23 +02:00
Andreas Kling
d203a86900 LibJS: Always inline the bytecode instruction iterator's operator++ 2021-10-25 13:37:02 +02:00
Andreas Kling
a97d75bb63 LibJS: Add default constructor for PrivateName
This avoids a round-trip through FlyString("") for every Reference.
2021-10-25 13:29:44 +02:00
Jan de Visser
9022cf99ff LibSQL: Add better error handling to evaluate and execute methods
There was a lot of `VERIFY_NOT_REACHED` error handling going on. Fixed
most of those.

A bit of a caveat is that after every `evaluate` call for expressions
that are part of a statement the error status of the `SQLResult` return
value must be called.
2021-10-25 12:59:42 +02:00
Jan de Visser
0cfb5eec32 LibSQL: First cut of SQL WHERE clause
Filters matching rows by doing a table scan and evaluating the `WHERE`
expression for every row.

Does not use indexes, for one because they do not exist yet.
2021-10-25 12:59:42 +02:00
Jan de Visser
9d1e27d8a8 LibSQL: Implement evaluate() method of BinaryOperatorExpression
Mostly just calls the appropriate methods on the Value objects.
Exception are the `Concatenate` (string concat), and the logical `and`
and `or` operators which are implemented directly in
`BinaryOperatorExpression::evaluate`
2021-10-25 12:59:42 +02:00
Jan de Visser
73fc023652 LibSQL: Implement binary operators for Value objects
The behaviour of the various operators is supposed to mimic that of
the same operators in PostgreSQL; the '+' operator for example will
successfully add '98' (string) and 2 (integer), but not 'foo' and 2.

Also removed some redundant const& parameter declarations for
intrinsic types (ints and doubles etc). Passing those by const& doesn't
make a lot of sense.
2021-10-25 12:59:42 +02:00
Andreas Kling
3618ca2420 LibJS: Propagate exceptions across bytecode executable boundaries
To support situations like this:

    function foo() { throw 1; }

    try {
        foo();
    } catch (e) {
    }

Each unwind context now keeps track of its origin executable.

When an exception is thrown, we return from run() immediately if the
nearest unwind context isn't in the current executable.

This causes a natural unwind to the point where we find the
catch/finally block(s) to jump into.
2021-10-25 12:57:21 +02:00
Andreas Kling
5a099b98cd LibJS: Make eval() code run in the bytecode VM
If we have an active bytecode interpreter, let's make eval() use it.
2021-10-25 12:57:21 +02:00
Andreas Kling
049b755123 LibJS: Make bytecode interpreter leave unwind context immediately
We were missing some "break" statements, causing us to actually finish
executing everything within "try" blocks before actually jumping to the
"catch" and/or "finally" blocks.
2021-10-25 12:57:21 +02:00
Andreas Kling
a831cd9cc7 LibJS: Make bytecode VM throw TypeError on attempt to call non-callable
This isn't perfect, but allows us to progress instead of crashing in
the TODO().
2021-10-25 12:57:21 +02:00
Andreas Kling
6fc3c14b7a LibJS: Fix bogus bytecode codegen for "catch" parameters
Add a missing '!' so that catch clauses with a named parameter actually
generate a SetVariable opcode.
2021-10-25 12:57:21 +02:00
Daniel Bertalan
15a14d3d21 LibX86: Take load base address into consideration during disassembly
Since our executables are position-independent, the address values
extraced from processes don't correspond to their values within the ELF
file. We have to offset the absolute addresses by the load base address
to get the relative symbol that we need for disassembly.
2021-10-25 12:14:26 +02:00
Jelle Raaijmakers
a44978b9b0 LibC: Fix %n conversion specifier in scanf() format
Also add a test to prevent this from happening again. There were two
bugs:

* The number of bytes just after processing the last value was written,
  instead of the number of bytes after skipping remaining whitespace.
  Confirmed by testing against GNU's `scanf()` since the man page
  leaves something to be desired.

* The number of bytes was written to the wrong variable argument; i.e.
  the first argument was overwritten.
2021-10-24 22:43:27 -07:00
Tim Schumacher
338f80cbf6 LibTest: Introduce a macro to only compare truthiness 2021-10-24 22:40:11 -07:00
Karol Kosek
78bebb363b LibHTTP: Reset m_content_length if there's a Transfer-Encoding header 2021-10-24 23:54:26 +02:00
Karol Kosek
89c87ff7b9 LibHTTP: Trim the last packet if it exceeded the Content-Length value
Used these commands to test it:

  printf 'HTTP/1.0 200 OK\r\n%s\r\n\r\n%s' 'Content-Length: 4' \
      'well hello friends!' | nc -lN 0.0.0.0 8000
  pro http://0.0.0.0:8000
2021-10-24 23:54:26 +02:00
Karol Kosek
a7e7cb0e70 LibHTTP: Store Content-Length value in the HTTP Job class
This way we can save some calculations, but more importantly this will
also be needed in next commits. :P
2021-10-24 23:54:26 +02:00
Karol Kosek
71f663b205 LibHTTP: Fix buffer overflow when body is larger than the Content-Length
(Actually, this also needs a Content-Encoding header, as response
streaming is disabled then. It didn't fit in the title.)

We were creating too small buffer -- instead of assigning the total
received buffer size, we were using the Content-Length value.

As you can see, the m_buffered_size might now exceed the Content-Length
value, but that will be handled in next commits, regardless if
the response can be streamed or not. :^)

Here's a minimal code that caused crash before:

  printf 'HTTP/1.0 200 OK\r\n%s\r\n%s\r\n\r\n%s' \
      'Content-Encoding: anything' 'Content-Length: 3' \
      ':^)AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' | nc -lN 0.0.0.0 8000
  pro http://0.0.0.0:8000
2021-10-24 23:54:26 +02:00
Sam Atkins
3e9191936b LibWeb: Remove now-unnecessary String copy when parsing CSS colors
Color::from_string() now does a case-insensitive comparison of color
names, so we don't need this copy. :^)
2021-10-24 22:12:35 +02:00
Sam Atkins
094dc04695 LibGfx: Make Color::from_string() case-insensitive
This function implements CSS color syntax, which is case-insensitive in
HTML contexts. Making it insensitive here means not having to remember
to do it in every user, (many of the HTML elements do not do this,) and
means they don't have to produce a lowercase copy of the input string
before passing it.
2021-10-24 22:12:35 +02:00
Sam Atkins
639c913e58 LibGfx: Make Color use east-const 2021-10-24 22:12:35 +02:00
Andreas Kling
b138b4c83f LibJS: Optimize Value::to_property_key() for numeric property names
If the Value is a non-negative Int32, create a numeric PropertyKey
instead of making a string key.

This makes "ai-astar" test from the Kraken benchmark run in 30 seconds,
down from 42 seconds. :^)
2021-10-24 17:18:09 +02:00
Andreas Kling
65a7296b8f LibJS: Make Value::to_property_key() return a JS::PropertyKey
Instead of returning JS::StringOrSymbol, which is a space-optimized type
used in Shape property tables, this now returns JS::PropertyKey which is
*not* space-optimized, but has other niceties like optimized storage of
numeric ("indexed") properties.
2021-10-24 17:18:09 +02:00
Andreas Kling
7ccb8c8609 LibJS: Provide default hash traits for JS::PropertyKey
Let's not require people to use PropertyNameTraits everywhere when we
can just specialize AK::Traits<JS::PropertyKey> instead. :^)
2021-10-24 17:18:09 +02:00
Andreas Kling
c02e992de2 LibJS: Use PropertyKey in MemberExpression::to_reference() 2021-10-24 17:18:09 +02:00
Andreas Kling
75f2510de9 LibJS: Make make_super_property_reference() take a PropertyKey
Let's get rid of StringOrSymbol usage outside of Shape.
2021-10-24 17:18:08 +02:00
Andreas Kling
398c181c79 LibJS: Rename PropertyName to PropertyKey
Let's use the same name as the spec. :^)
2021-10-24 17:18:07 +02:00
Andreas Kling
715e7fada8 LibJS: Add the "fast non-local access" optimization to the bytecode VM
The GetVariable bytecode op now caches environment coordinates for fast
cross-scope variable lookup.
2021-10-24 17:18:07 +02:00
Andreas Kling
da98212001 LibJS: Add a separate "identifier table" to bytecode executables
This is a specialized string table for storing identifiers only.
Identifiers are always FlyStrings, which makes many common operations
faster by allowing O(1) comparison.
2021-10-24 17:18:07 +02:00
Andreas Kling
13f04e37e5 LibJS: Use String and move semantics in Bytecode::StringTable
Avoid creating new AK::String objects when we already have one.
2021-10-24 17:18:07 +02:00
Andreas Kling
3117182c2e LibJS: Implement 'this' in the bytecode VM
ThisExpression now emits a "ResolveThisBinding" bytecode op, which
simply loads the VM's current 'this' binding into the accumulator.
2021-10-24 17:18:06 +02:00
Andreas Kling
7c7bc4f44a LibJS: Alphabetize the bytecode opcode list 2021-10-24 17:18:06 +02:00
Andreas Kling
f75d78f56a LibJS: Include executable name in bytecode dumps 2021-10-24 17:18:06 +02:00
Andreas Kling
c95dde971b LibJS: Move global "should dump bytecode" flag into LibJS
This will allow us to trigger bytecode executable dumps when generating
bytecode inside LibJS as well, not just in clients like js and test-js.
2021-10-24 17:18:06 +02:00
Andreas Kling
da77e2aa4f LibJS: Add Bytecode::Executable::dump()
Let's have a helper for producing a consistent executable dump instead
of repeating the logic in multiple places.
2021-10-24 17:18:05 +02:00
davidot
9c9aaf4d4f LibJS: Don't VERIFY that a function is Regular when executing in AST
By replacing this VERIFY with a thrown Error we no longer crash when
calling a generator function in the AST interpreter. This allows us to
more gracefully handle situation which have not been implemented yet.
In particular this helps the libjs-test262-runner since it can now
continue on to the next tests instead of having the entire process end.
2021-10-24 08:38:02 +01:00
Daniel Bertalan
b3ac24a939 LibC: Use a sensible MB_CUR_MAX value
We always use UTF-8, meaning that a single `wchar_t` might be converted
into up to 4 `char`s. This would cause a buffer overflow if something
actually relied on this being the right value.
2021-10-23 23:31:43 -07:00
Daniel Bertalan
ba975f4ba4 LibC: Define locale categories (LC_*) as macros
The C standard states that these symbols should be declared as macros,
not as emum variants as we were doing previously. This is used in some
ports (e.g. bash) to conditionally compile locale-dependent
functionality.

We now use the same trick here as with the errno constants. We keep the
enum, but also create macros that defer to the enum variants.
2021-10-23 23:31:43 -07:00
Andreas Kling
fa753ff863 LibCore: Pop the main Core::EventLoop off the stack when destroyed
The main event loop pushes itself onto the event loop stack, and so it
should also pop itself when destroyed.

This will surface attempts to use the event loop stack after the main
event loop has been destroyed.
2021-10-24 01:01:01 +02:00
Andreas Kling
3bed7d5a5e LibIPC: Use a zero-delay timer for message processing
This lets us avoid using Core::deferred_invoke() which is not usable
during application teardown (as there is no event loop to push the
deferred invocation onto.)

(Not that there is an event loop to fire the processing timer during
teardown *either*, but at least we can exit gracefully with pending
timers, unlike deferred invocations, which hang the process. This is an
area where more improvements are definitely needed!)
2021-10-24 01:01:01 +02:00
Andreas Kling
24642861af LibIPC: Store local endpoint magic in a ConnectionBase member
This simplifies some of the code, since it's no longer necessary for the
templated code to pass LocalEndpoint::static_magic() everywhere.
2021-10-24 01:01:01 +02:00
Andreas Kling
9a8bdf84c8 LibIPC: Move waiting for synchronous responses to ConnectionBase 2021-10-24 01:01:01 +02:00
Andreas Kling
8728d36dd0 LibIPC: Move more of IPC::Connection to ConnectionBase
This patch moves the templated message parsing code to a virtual
try_parse_messages() helper. By doing that, we can move the rest of the
socket draining code up to ConnectionBase and keep it out of line.
2021-10-24 01:01:01 +02:00
Andreas Kling
f3c4a357ea LibIPC: Move non-templated parts of IPC::Connection out of line
This patch splits IPC::Connection into Connection and ConnectionBase.
ConnectionBase moves into Connection.cpp so we don't have to inline it
for every single templated subclass.
2021-10-24 01:01:01 +02:00