From 500818e73d16747cdbbccd363568d5d28277c7b8 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Sat, 19 Jun 2021 22:27:53 +0100 Subject: [PATCH] LibJS: Implement the GetPrototypeFromConstructor() abstract operation --- .../LibJS/Runtime/AbstractOperations.cpp | 16 ++++++++++++++++ .../Libraries/LibJS/Runtime/AbstractOperations.h | 1 + 2 files changed, 17 insertions(+) diff --git a/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp b/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp index f9a483f6e6..da23099f6d 100644 --- a/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp +++ b/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp @@ -140,4 +140,20 @@ GlobalObject* get_function_realm(GlobalObject& global_object, Function const& fu return &global_object; } +// 10.1.14 GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) +Object* get_prototype_from_constructor(GlobalObject& global_object, Function const& constructor, Object* (GlobalObject::*intrinsic_default_prototype)()) +{ + auto& vm = global_object.vm(); + auto prototype = constructor.get(vm.names.prototype); + if (vm.exception()) + return nullptr; + if (!prototype.is_object()) { + auto* realm = get_function_realm(global_object, constructor); + if (vm.exception()) + return nullptr; + prototype = (realm->*intrinsic_default_prototype)(); + } + return &prototype.as_object(); +} + } diff --git a/Userland/Libraries/LibJS/Runtime/AbstractOperations.h b/Userland/Libraries/LibJS/Runtime/AbstractOperations.h index ede34dea1f..ffcff07c06 100644 --- a/Userland/Libraries/LibJS/Runtime/AbstractOperations.h +++ b/Userland/Libraries/LibJS/Runtime/AbstractOperations.h @@ -18,5 +18,6 @@ size_t length_of_array_like(GlobalObject&, Object const&); MarkedValueList create_list_from_array_like(GlobalObject&, Value, AK::Function(Value)> = {}); Function* species_constructor(GlobalObject&, Object const&, Function& default_constructor); GlobalObject* get_function_realm(GlobalObject&, Function const&); +Object* get_prototype_from_constructor(GlobalObject&, Function const& constructor, Object* (GlobalObject::*intrinsic_default_prototype)()); }