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

LibJS: Avoid pointless transitions and metadata lookups in storage_set()

- Replace the misleading abuse of the m_transitions_enabled flag for the
  fast path without lookup with a new m_initialized boolean that's set
  either by Heap::allocate() after calling the Object's initialize(), or
  by the GlobalObject in its special initialize_global_object(). This
  makes it work regardless of the shape's uniqueness.
- When we're adding a new property past the initialization phase,
  there's no need to do a second metadata lookup to retrieve the storage
  value offset - it's known to always be the shape's property count
  minus one. Also, instead of doing manual storage resizing and
  assignment via indexing, just use Vector::append().
- When we didn't add a new property but are overwriting an existing one,
  the property count and therefore storage value offset doesn't change,
  so we don't have to retrieve it either.

As a result, Object::set_shape() is now solely responsible for updating
the m_shape pointer and is not resizing storage anymore, so I moved it
into the header.
This commit is contained in:
Linus Groh 2021-08-28 17:12:14 +01:00
parent d6de0613f5
commit 222e518a53
4 changed files with 40 additions and 29 deletions

View file

@ -7,6 +7,7 @@
#pragma once
#include <AK/Badge.h>
#include <AK/HashMap.h>
#include <AK/String.h>
#include <LibJS/Forward.h>
@ -160,6 +161,9 @@ public:
void enable_transitions() { m_transitions_enabled = true; }
void disable_transitions() { m_transitions_enabled = false; }
void set_initialized(Badge<Heap>) { m_initialized = true; }
void set_initialized(Badge<GlobalObject>) { m_initialized = true; }
template<typename T>
bool fast_is() const = delete;
@ -176,12 +180,13 @@ protected:
bool m_has_parameter_map { false };
private:
void set_shape(Shape&);
void set_shape(Shape& shape) { m_shape = &shape; }
Object* prototype() { return shape().prototype(); }
Object const* prototype() const { return shape().prototype(); }
bool m_transitions_enabled { true };
bool m_initialized { false };
Shape* m_shape { nullptr };
Vector<Value> m_storage;
IndexedProperties m_indexed_properties;