summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibJS/Runtime/GlobalObject.h
diff options
context:
space:
mode:
authorLinus Groh <mail@linusgroh.de>2022-08-27 00:54:55 +0100
committerLinus Groh <mail@linusgroh.de>2022-08-27 11:29:10 +0100
commit50428ea8d21045bbc3c5584a16496cff4a38fdc5 (patch)
treef56dee290ed47d0d796d51cdcb41e02c22ae40a6 /Userland/Libraries/LibJS/Runtime/GlobalObject.h
parent84c4b66721c893775938e40808486e1ce506732e (diff)
downloadserenity-50428ea8d21045bbc3c5584a16496cff4a38fdc5.zip
LibJS: Move intrinsics to the realm
Intrinsics, i.e. mostly constructor and prototype objects, but also things like empty and new object shape now live on a new heap-allocated JS::Intrinsics object, thus completing the long journey of taking all the magic away from the global object. This represents the Realm's [[Intrinsics]] slot in the spec and matches its existing [[GlobalObject]] / [[GlobalEnv]] slots in terms of architecture. In the majority of cases it should now be possibly to fully allocate a regular object without the global object existing, and in fact that's what we do now - the realm is allocated before the global object, and the intrinsics between both :^)
Diffstat (limited to 'Userland/Libraries/LibJS/Runtime/GlobalObject.h')
-rw-r--r--Userland/Libraries/LibJS/Runtime/GlobalObject.h145
1 files changed, 0 insertions, 145 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/GlobalObject.h b/Userland/Libraries/LibJS/Runtime/GlobalObject.h
index ef9a2ae1c2..6222fcba75 100644
--- a/Userland/Libraries/LibJS/Runtime/GlobalObject.h
+++ b/Userland/Libraries/LibJS/Runtime/GlobalObject.h
@@ -27,86 +27,6 @@ public:
Realm* associated_realm();
void set_associated_realm(Realm&);
- Shape* empty_object_shape() { return m_empty_object_shape; }
-
- Shape* new_object_shape() { return m_new_object_shape; }
- Shape* new_ordinary_function_prototype_object_shape() { return m_new_ordinary_function_prototype_object_shape; }
-
- // Not included in JS_ENUMERATE_NATIVE_OBJECTS due to missing distinct prototype
- ProxyConstructor* proxy_constructor() { return m_proxy_constructor; }
-
- // Not included in JS_ENUMERATE_NATIVE_OBJECTS due to missing distinct constructor
- Object* async_from_sync_iterator_prototype() { return m_async_from_sync_iterator_prototype; }
- Object* async_generator_prototype() { return m_async_generator_prototype; }
- Object* generator_prototype() { return m_generator_prototype; }
-
- // Alias for the AsyncGenerator Prototype Object used by the spec (%AsyncGeneratorFunction.prototype.prototype%)
- Object* async_generator_function_prototype_prototype() { return m_async_generator_prototype; }
- // Alias for the Generator Prototype Object used by the spec (%GeneratorFunction.prototype.prototype%)
- Object* generator_function_prototype_prototype() { return m_generator_prototype; }
-
- // Not included in JS_ENUMERATE_INTL_OBJECTS due to missing distinct constructor
- Object* intl_segments_prototype() { return m_intl_segments_prototype; }
-
- FunctionObject* array_prototype_values_function() const { return m_array_prototype_values_function; }
- FunctionObject* date_constructor_now_function() const { return m_date_constructor_now_function; }
- FunctionObject* eval_function() const { return m_eval_function; }
- FunctionObject* json_parse_function() const { return m_json_parse_function; }
- FunctionObject* object_prototype_to_string_function() const { return m_object_prototype_to_string_function; }
- FunctionObject* throw_type_error_function() const { return m_throw_type_error_function; }
-
-#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName, ArrayType) \
- ConstructorName* snake_name##_constructor() \
- { \
- return m_##snake_name##_constructor; \
- } \
- Object* snake_name##_prototype() \
- { \
- return m_##snake_name##_prototype; \
- }
- JS_ENUMERATE_BUILTIN_TYPES
-#undef __JS_ENUMERATE
-
-#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName) \
- Intl::ConstructorName* intl_##snake_name##_constructor() \
- { \
- return m_intl_##snake_name##_constructor; \
- } \
- Object* intl_##snake_name##_prototype() \
- { \
- return m_intl_##snake_name##_prototype; \
- }
- JS_ENUMERATE_INTL_OBJECTS
-#undef __JS_ENUMERATE
-
-#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName) \
- Temporal::ConstructorName* temporal_##snake_name##_constructor() \
- { \
- return m_temporal_##snake_name##_constructor; \
- } \
- Object* temporal_##snake_name##_prototype() \
- { \
- return m_temporal_##snake_name##_prototype; \
- }
- JS_ENUMERATE_TEMPORAL_OBJECTS
-#undef __JS_ENUMERATE
-
-#define __JS_ENUMERATE(ClassName, snake_name) \
- Object* snake_name##_prototype() \
- { \
- return m_##snake_name##_prototype; \
- }
- JS_ENUMERATE_ITERATOR_PROTOTYPES
-#undef __JS_ENUMERATE
-
-protected:
- virtual void visit_edges(Visitor&) override;
-
- template<typename ConstructorType>
- void initialize_constructor(Realm&, PropertyKey const&, ConstructorType*&, Object* prototype, PropertyAttributes = Attribute::Writable | Attribute::Configurable);
- template<typename ConstructorType>
- void add_constructor(Realm&, PropertyKey const&, ConstructorType*&, Object* prototype);
-
private:
virtual bool is_global_object() const final { return true; }
@@ -124,74 +44,9 @@ private:
JS_DECLARE_NATIVE_FUNCTION(unescape);
NonnullOwnPtr<Console> m_console;
-
WeakPtr<Realm> m_associated_realm;
-
- Shape* m_empty_object_shape { nullptr };
- Shape* m_new_object_shape { nullptr };
- Shape* m_new_ordinary_function_prototype_object_shape { nullptr };
-
- // Not included in JS_ENUMERATE_NATIVE_OBJECTS due to missing distinct prototype
- ProxyConstructor* m_proxy_constructor { nullptr };
-
- // Not included in JS_ENUMERATE_NATIVE_OBJECTS due to missing distinct constructor
- Object* m_async_from_sync_iterator_prototype { nullptr };
- Object* m_async_generator_prototype { nullptr };
- Object* m_generator_prototype { nullptr };
-
- // Not included in JS_ENUMERATE_INTL_OBJECTS due to missing distinct constructor
- Object* m_intl_segments_prototype { nullptr };
-
- FunctionObject* m_array_prototype_values_function { nullptr };
- FunctionObject* m_date_constructor_now_function { nullptr };
- FunctionObject* m_eval_function { nullptr };
- FunctionObject* m_json_parse_function { nullptr };
- FunctionObject* m_object_prototype_to_string_function { nullptr };
- FunctionObject* m_throw_type_error_function { nullptr };
-
-#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName, ArrayType) \
- ConstructorName* m_##snake_name##_constructor { nullptr }; \
- Object* m_##snake_name##_prototype { nullptr };
- JS_ENUMERATE_BUILTIN_TYPES
-#undef __JS_ENUMERATE
-
-#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName) \
- Intl::ConstructorName* m_intl_##snake_name##_constructor { nullptr }; \
- Object* m_intl_##snake_name##_prototype { nullptr };
- JS_ENUMERATE_INTL_OBJECTS
-#undef __JS_ENUMERATE
-
-#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName) \
- Temporal::ConstructorName* m_temporal_##snake_name##_constructor { nullptr }; \
- Object* m_temporal_##snake_name##_prototype { nullptr };
- JS_ENUMERATE_TEMPORAL_OBJECTS
-#undef __JS_ENUMERATE
-
-#define __JS_ENUMERATE(ClassName, snake_name) \
- Object* m_##snake_name##_prototype { nullptr };
- JS_ENUMERATE_ITERATOR_PROTOTYPES
-#undef __JS_ENUMERATE
};
-template<typename ConstructorType>
-inline void GlobalObject::initialize_constructor(Realm& realm, PropertyKey const& property_key, ConstructorType*& constructor, Object* prototype, PropertyAttributes attributes)
-{
- auto& vm = this->vm();
- constructor = heap().allocate<ConstructorType>(realm, realm);
- constructor->define_direct_property(vm.names.name, js_string(heap(), property_key.as_string()), Attribute::Configurable);
- if (prototype)
- prototype->define_direct_property(vm.names.constructor, constructor, attributes);
-}
-
-template<typename ConstructorType>
-inline void GlobalObject::add_constructor(Realm& realm, PropertyKey const& property_key, ConstructorType*& constructor, Object* prototype)
-{
- // Some constructors are pre-initialized separately.
- if (!constructor)
- initialize_constructor(realm, property_key, constructor, prototype);
- define_direct_property(property_key, constructor, Attribute::Writable | Attribute::Configurable);
-}
-
inline GlobalObject* Shape::global_object() const
{
return &static_cast<GlobalObject&>(m_realm.global_object());