Jelajahi Sumber

LibJS: Add a [[Realm]] getter to FunctionObject and use it where needed

Defined by https://tc39.es/ecma262/#sec-ordinaryfunctioncreate step #17
and by https://tc39.es/ecma262/#sec-createbuiltinfunction step #6.
Idan Horowitz 4 tahun lalu
induk
melakukan
5606332ed7

+ 2 - 3
Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp

@@ -110,9 +110,8 @@ GlobalObject* get_function_realm(GlobalObject& global_object, FunctionObject con
 {
     auto& vm = global_object.vm();
 
-    // FIXME: not sure how to do this currently.
-    // 2. If obj has a [[Realm]] internal slot, then
-    //     a. Return obj.[[Realm]].
+    if (function.realm())
+        return function.realm();
     if (is<BoundFunction>(function)) {
         auto& bound_function = static_cast<BoundFunction const&>(function);
         auto& target = bound_function.target_function();

+ 3 - 0
Userland/Libraries/LibJS/Runtime/FunctionObject.h

@@ -47,6 +47,9 @@ public:
     // Used as the outer environment when evaluating the code of the function.
     virtual EnvironmentRecord* environment() { return nullptr; }
 
+    // [[Realm]]
+    virtual GlobalObject* realm() const { return nullptr; }
+
     enum class ThisMode : u8 {
         Lexical,
         Strict,

+ 2 - 0
Userland/Libraries/LibJS/Runtime/NativeFunction.h

@@ -29,6 +29,8 @@ public:
 
     virtual bool is_strict_mode() const override;
 
+    GlobalObject* realm() const override { return &global_object(); }
+
 protected:
     NativeFunction(FlyString name, Object& prototype);
     explicit NativeFunction(Object& prototype);

+ 1 - 0
Userland/Libraries/LibJS/Runtime/OrdinaryFunctionObject.cpp

@@ -56,6 +56,7 @@ OrdinaryFunctionObject::OrdinaryFunctionObject(GlobalObject& global_object, cons
     , m_body(body)
     , m_parameters(move(parameters))
     , m_environment(parent_scope)
+    , m_realm(&global_object)
     , m_function_length(function_length)
     , m_kind(kind)
     , m_is_strict(is_strict)

+ 3 - 0
Userland/Libraries/LibJS/Runtime/OrdinaryFunctionObject.h

@@ -37,6 +37,8 @@ public:
 
     virtual EnvironmentRecord* environment() override { return m_environment; }
 
+    GlobalObject* realm() const override { return m_realm; }
+
 protected:
     virtual bool is_strict_mode() const final { return m_is_strict; }
 
@@ -55,6 +57,7 @@ private:
     const Vector<FunctionNode::Parameter> m_parameters;
     Optional<Bytecode::Executable> m_bytecode_executable;
     EnvironmentRecord* m_environment { nullptr };
+    GlobalObject* m_realm { nullptr };
     i32 m_function_length { 0 };
     FunctionKind m_kind { FunctionKind::Regular };
     bool m_is_strict { false };