diff options
author | Andreas Kling <kling@serenityos.org> | 2020-06-20 15:40:48 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-06-20 15:46:30 +0200 |
commit | 64513f3c23f880b87d26e669b777b4796b065796 (patch) | |
tree | 1881da32047261c985bc016ddd231d0141587fad /Libraries/LibJS/Runtime/Object.cpp | |
parent | e4add199153bd32a7a4ccbe32751c799aaacaea9 (diff) | |
download | serenity-64513f3c23f880b87d26e669b777b4796b065796.zip |
LibJS: Move native objects towards two-pass construction
To make sure that everything is set up correctly in objects before we
start adding properties to them, we split cell allocation into 3 steps:
1. Allocate a cell of appropriate size from the Heap
2. Call the C++ constructor on the cell
3. Call initialize() on the constructed object
The job of initialize() is to define all the initial properties.
Doing it in a second pass guarantees that the Object has a valid Shape
and can find its own GlobalObject.
Diffstat (limited to 'Libraries/LibJS/Runtime/Object.cpp')
-rw-r--r-- | Libraries/LibJS/Runtime/Object.cpp | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/Libraries/LibJS/Runtime/Object.cpp b/Libraries/LibJS/Runtime/Object.cpp index 0f36ed527c..544de42add 100644 --- a/Libraries/LibJS/Runtime/Object.cpp +++ b/Libraries/LibJS/Runtime/Object.cpp @@ -82,7 +82,7 @@ PropertyDescriptor PropertyDescriptor::from_dictionary(Interpreter& interpreter, Object* Object::create_empty(Interpreter&, GlobalObject& global_object) { - return global_object.heap().allocate<Object>(global_object.object_prototype()); + return global_object.heap().allocate<Object>(global_object, global_object.object_prototype()); } Object::Object(Object* prototype) @@ -92,10 +92,14 @@ Object::Object(Object* prototype) set_prototype(prototype); } else { // This is the global object - m_shape = interpreter().heap().allocate<Shape>(static_cast<GlobalObject&>(*this)); + m_shape = interpreter().heap().allocate<Shape>(static_cast<GlobalObject&>(*this), static_cast<GlobalObject&>(*this)); } } +void Object::initialize(Interpreter&, GlobalObject&) +{ +} + Object::~Object() { } @@ -694,7 +698,7 @@ bool Object::define_native_function(const FlyString& property_name, AK::Function bool Object::define_native_property(const FlyString& property_name, AK::Function<Value(Interpreter&, GlobalObject&)> getter, AK::Function<void(Interpreter&, GlobalObject&, Value)> setter, PropertyAttributes attribute) { - return define_property(property_name, heap().allocate<NativeProperty>(move(getter), move(setter)), attribute); + return define_property(property_name, heap().allocate<NativeProperty>(global_object(), move(getter), move(setter)), attribute); } void Object::visit_children(Cell::Visitor& visitor) |