1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 17:37:37 +00:00

LibJS: Start implementing object shapes

This patch adds JS::Shape, which implements a transition tree for our
Object class. Object property keys, prototypes and attributes are now
stored in a Shape, and each Object has a Shape.

When adding a property to an Object, we make a transition from the old
Shape to a new Shape. If we've made the same exact transition in the
past (with another Object), we reuse the same transition and both
objects may now share a Shape.

This will become the foundation of inline caching and other engine
optimizations in the future. :^)
This commit is contained in:
Andreas Kling 2020-04-02 19:32:21 +02:00
parent 3906d2b46a
commit 5e6e1fd482
10 changed files with 252 additions and 29 deletions

View file

@ -29,6 +29,7 @@
#include <LibJS/Interpreter.h>
#include <LibJS/Runtime/Array.h>
#include <LibJS/Runtime/ObjectConstructor.h>
#include <LibJS/Runtime/Shape.h>
namespace JS {
@ -68,7 +69,7 @@ Value ObjectConstructor::get_own_property_names(Interpreter& interpreter)
for (i32 i = 0; i < array->length(); ++i)
result->push(js_string(interpreter.heap(), String::number(i)));
}
for (auto& it : object->own_properties())
for (auto& it : object->shape().property_table())
result->push(js_string(interpreter.heap(), it.key));
return result;
}