Przeglądaj źródła

LibJS: Add EnvironmentRecord::global_object()

Our environment records are currently weird in that they inherit from
Object, but don't have a connection to the global object.

I'd like to remove this inheritance, and the first step is giving them
their own pointer to the global object.
Andreas Kling 4 lat temu
rodzic
commit
f1e1d9dd74

+ 6 - 0
Userland/Libraries/LibJS/Runtime/EnvironmentRecord.cpp

@@ -15,6 +15,12 @@ EnvironmentRecord::EnvironmentRecord(EnvironmentRecord* outer_environment)
 {
 }
 
+void EnvironmentRecord::initialize(GlobalObject& global_object)
+{
+    m_global_object = &global_object;
+    Base::initialize(global_object);
+}
+
 void EnvironmentRecord::visit_edges(Visitor& visitor)
 {
     Base::visit_edges(visitor);

+ 8 - 0
Userland/Libraries/LibJS/Runtime/EnvironmentRecord.h

@@ -19,6 +19,11 @@ class EnvironmentRecord : public Object {
     JS_OBJECT(EnvironmentRecord, Object);
 
 public:
+    GlobalObject& global_object() { return *m_global_object; }
+    GlobalObject const& global_object() const { return *m_global_object; }
+
+    virtual void initialize(GlobalObject&) override;
+
     virtual Optional<Variable> get_from_environment_record(FlyString const&) const = 0;
     virtual void put_into_environment_record(FlyString const&, Variable) = 0;
     virtual bool delete_from_environment_record(FlyString const&) = 0;
@@ -44,6 +49,9 @@ protected:
     virtual void visit_edges(Visitor&) override;
 
 private:
+    virtual bool is_environment_record() const final { return true; }
+
+    GlobalObject* m_global_object { nullptr };
     EnvironmentRecord* m_outer_environment { nullptr };
 };
 

+ 1 - 0
Userland/Libraries/LibJS/Runtime/Object.h

@@ -108,6 +108,7 @@ public:
     virtual bool is_global_object() const { return false; }
     virtual bool is_proxy_object() const { return false; }
     virtual bool is_native_function() const { return false; }
+    virtual bool is_environment_record() const { return false; }
     virtual bool is_global_environment_record() const { return false; }
     virtual bool is_declarative_environment_record() const { return false; }
     virtual bool is_function_environment_record() const { return false; }