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:
parent
d6de0613f5
commit
222e518a53
4 changed files with 40 additions and 29 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue