Pārlūkot izejas kodu

LibJS: Make global objects have unique shape from the start

There's no point in trying to achieve shape sharing for global objects,
so we can simply make the shape unique from the start and avoid making
a transition chain.
Andreas Kling 4 gadi atpakaļ
vecāks
revīzija
ec55490198

+ 2 - 0
Libraries/LibJS/Runtime/GlobalObject.cpp

@@ -75,6 +75,8 @@ GlobalObject::GlobalObject()
 
 
 void GlobalObject::initialize()
 void GlobalObject::initialize()
 {
 {
+    ensure_shape_is_unique();
+
     // These are done first since other prototypes depend on their presence.
     // These are done first since other prototypes depend on their presence.
     m_empty_object_shape = heap().allocate<Shape>(*this, *this);
     m_empty_object_shape = heap().allocate<Shape>(*this, *this);
     m_object_prototype = heap().allocate_without_global_object<ObjectPrototype>(*this);
     m_object_prototype = heap().allocate_without_global_object<ObjectPrototype>(*this);

+ 2 - 1
Libraries/LibJS/Runtime/Object.h

@@ -149,6 +149,8 @@ public:
 
 
     Value invoke(const StringOrSymbol& property_name, Optional<MarkedValueList> arguments = {});
     Value invoke(const StringOrSymbol& property_name, Optional<MarkedValueList> arguments = {});
 
 
+    void ensure_shape_is_unique();
+
 protected:
 protected:
     enum class GlobalObjectTag { Tag };
     enum class GlobalObjectTag { Tag };
     enum class ConstructWithoutPrototypeTag { Tag };
     enum class ConstructWithoutPrototypeTag { Tag };
@@ -165,7 +167,6 @@ private:
     void call_native_property_setter(Object* this_object, Value property, Value) const;
     void call_native_property_setter(Object* this_object, Value property, Value) const;
 
 
     void set_shape(Shape&);
     void set_shape(Shape&);
-    void ensure_shape_is_unique();
 
 
     bool m_is_extensible { true };
     bool m_is_extensible { true };
     Shape* m_shape { nullptr };
     Shape* m_shape { nullptr };