1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 00:17:46 +00:00

LibJS: Make intrinsics getters return NonnullGCPtr

Some of these are allocated upon initialization of the intrinsics, and
some lazily, but in neither case the getters actually return a nullptr.

This saves us a whole bunch of pointer dereferences (as NonnullGCPtr has
an `operator T&()`), and also has the interesting side effect of forcing
us to explicitly use the FunctionObject& overload of call(), as passing
a NonnullGCPtr is ambigous - it could implicitly be turned into a Value
_or_ a FunctionObject& (so we have to dereference manually).
This commit is contained in:
Linus Groh 2023-04-13 00:47:15 +02:00
parent ed9e2366da
commit b84f8fb55b
182 changed files with 564 additions and 567 deletions

View file

@ -17,75 +17,75 @@ class Intrinsics final : public Cell {
public:
static ThrowCompletionOr<NonnullGCPtr<Intrinsics>> create(Realm&);
Shape* empty_object_shape() { return m_empty_object_shape; }
NonnullGCPtr<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; }
NonnullGCPtr<Shape> new_object_shape() { return *m_new_object_shape; }
NonnullGCPtr<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; }
NonnullGCPtr<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; }
NonnullGCPtr<Object> async_from_sync_iterator_prototype() { return *m_async_from_sync_iterator_prototype; }
NonnullGCPtr<Object> async_generator_prototype() { return *m_async_generator_prototype; }
NonnullGCPtr<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; }
NonnullGCPtr<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; }
NonnullGCPtr<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; }
NonnullGCPtr<Object> intl_segments_prototype() { return *m_intl_segments_prototype; }
// Global object functions
FunctionObject* eval_function() const { return m_eval_function; }
FunctionObject* is_finite_function() const { return m_is_finite_function; }
FunctionObject* is_nan_function() const { return m_is_nan_function; }
FunctionObject* parse_float_function() const { return m_parse_float_function; }
FunctionObject* parse_int_function() const { return m_parse_int_function; }
FunctionObject* decode_uri_function() const { return m_decode_uri_function; }
FunctionObject* decode_uri_component_function() const { return m_decode_uri_component_function; }
FunctionObject* encode_uri_function() const { return m_encode_uri_function; }
FunctionObject* encode_uri_component_function() const { return m_encode_uri_component_function; }
FunctionObject* escape_function() const { return m_escape_function; }
FunctionObject* unescape_function() const { return m_unescape_function; }
NonnullGCPtr<FunctionObject> eval_function() const { return *m_eval_function; }
NonnullGCPtr<FunctionObject> is_finite_function() const { return *m_is_finite_function; }
NonnullGCPtr<FunctionObject> is_nan_function() const { return *m_is_nan_function; }
NonnullGCPtr<FunctionObject> parse_float_function() const { return *m_parse_float_function; }
NonnullGCPtr<FunctionObject> parse_int_function() const { return *m_parse_int_function; }
NonnullGCPtr<FunctionObject> decode_uri_function() const { return *m_decode_uri_function; }
NonnullGCPtr<FunctionObject> decode_uri_component_function() const { return *m_decode_uri_component_function; }
NonnullGCPtr<FunctionObject> encode_uri_function() const { return *m_encode_uri_function; }
NonnullGCPtr<FunctionObject> encode_uri_component_function() const { return *m_encode_uri_component_function; }
NonnullGCPtr<FunctionObject> escape_function() const { return *m_escape_function; }
NonnullGCPtr<FunctionObject> unescape_function() const { return *m_unescape_function; }
// Namespace/constructor object functions
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* json_parse_function() const { return m_json_parse_function; }
FunctionObject* json_stringify_function() const { return m_json_stringify_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; }
NonnullGCPtr<FunctionObject> array_prototype_values_function() const { return *m_array_prototype_values_function; }
NonnullGCPtr<FunctionObject> date_constructor_now_function() const { return *m_date_constructor_now_function; }
NonnullGCPtr<FunctionObject> json_parse_function() const { return *m_json_parse_function; }
NonnullGCPtr<FunctionObject> json_stringify_function() const { return *m_json_stringify_function; }
NonnullGCPtr<FunctionObject> object_prototype_to_string_function() const { return *m_object_prototype_to_string_function; }
NonnullGCPtr<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(); \
Object* snake_name##_prototype();
NonnullGCPtr<ConstructorName> snake_name##_constructor(); \
NonnullGCPtr<Object> snake_name##_prototype();
JS_ENUMERATE_BUILTIN_TYPES
#undef __JS_ENUMERATE
#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName) \
Intl::ConstructorName* intl_##snake_name##_constructor(); \
Object* intl_##snake_name##_prototype();
NonnullGCPtr<Intl::ConstructorName> intl_##snake_name##_constructor(); \
NonnullGCPtr<Object> 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(); \
Object* temporal_##snake_name##_prototype();
#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName) \
NonnullGCPtr<Temporal::ConstructorName> temporal_##snake_name##_constructor(); \
NonnullGCPtr<Object> temporal_##snake_name##_prototype();
JS_ENUMERATE_TEMPORAL_OBJECTS
#undef __JS_ENUMERATE
#define __JS_ENUMERATE(ClassName, snake_name) \
ClassName* snake_name##_object();
NonnullGCPtr<ClassName> snake_name##_object();
JS_ENUMERATE_BUILTIN_NAMESPACE_OBJECTS
#undef __JS_ENUMERATE
#define __JS_ENUMERATE(ClassName, snake_name) \
Object* snake_name##_prototype() \
{ \
return m_##snake_name##_prototype; \
#define __JS_ENUMERATE(ClassName, snake_name) \
NonnullGCPtr<Object> snake_name##_prototype() \
{ \
return *m_##snake_name##_prototype; \
}
JS_ENUMERATE_ITERATOR_PROTOTYPES
#undef __JS_ENUMERATE