AbstractOperations.h 4.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /*
  2. * Copyright (c) 2020-2021, Linus Groh <linusg@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Forward.h>
  8. #include <LibJS/AST.h>
  9. #include <LibJS/Forward.h>
  10. #include <LibJS/Runtime/GlobalObject.h>
  11. #include <LibJS/Runtime/PrivateEnvironment.h>
  12. #include <LibJS/Runtime/Value.h>
  13. namespace JS {
  14. DeclarativeEnvironment* new_declarative_environment(Environment&);
  15. ObjectEnvironment* new_object_environment(Object&, bool is_with_environment, Environment*);
  16. FunctionEnvironment* new_function_environment(ECMAScriptFunctionObject&, Object* new_target);
  17. PrivateEnvironment* new_private_environment(VM& vm, PrivateEnvironment* outer);
  18. Environment& get_this_environment(VM&);
  19. Object* get_super_constructor(VM&);
  20. ThrowCompletionOr<Reference> make_super_property_reference(GlobalObject&, Value actual_this, StringOrSymbol const& property_key, bool strict);
  21. ThrowCompletionOr<Value> require_object_coercible(GlobalObject&, Value);
  22. ThrowCompletionOr<Value> call_impl(GlobalObject&, Value function, Value this_value, Optional<MarkedValueList> = {});
  23. ThrowCompletionOr<Object*> construct(GlobalObject&, FunctionObject&, Optional<MarkedValueList> = {}, FunctionObject* new_target = nullptr);
  24. ThrowCompletionOr<size_t> length_of_array_like(GlobalObject&, Object const&);
  25. ThrowCompletionOr<MarkedValueList> create_list_from_array_like(GlobalObject&, Value, Function<ThrowCompletionOr<void>(Value)> = {});
  26. ThrowCompletionOr<FunctionObject*> species_constructor(GlobalObject&, Object const&, FunctionObject& default_constructor);
  27. ThrowCompletionOr<Realm*> get_function_realm(GlobalObject&, FunctionObject const&);
  28. bool is_compatible_property_descriptor(bool extensible, PropertyDescriptor const&, Optional<PropertyDescriptor> const& current);
  29. bool validate_and_apply_property_descriptor(Object*, PropertyName const&, bool extensible, PropertyDescriptor const&, Optional<PropertyDescriptor> const& current);
  30. ThrowCompletionOr<Object*> get_prototype_from_constructor(GlobalObject&, FunctionObject const& constructor, Object* (GlobalObject::*intrinsic_default_prototype)());
  31. Object* create_unmapped_arguments_object(GlobalObject&, Span<Value> arguments);
  32. Object* create_mapped_arguments_object(GlobalObject&, FunctionObject&, Vector<FunctionNode::Parameter> const&, Span<Value> arguments, Environment&);
  33. Value canonical_numeric_index_string(GlobalObject&, PropertyName const&);
  34. ThrowCompletionOr<String> get_substitution(GlobalObject&, Utf16View const& matched, Utf16View const& str, size_t position, Span<Value> captures, Value named_captures, Value replacement);
  35. enum class CallerMode {
  36. Strict,
  37. NonStrict
  38. };
  39. enum class EvalMode {
  40. Direct,
  41. Indirect
  42. };
  43. ThrowCompletionOr<Value> perform_eval(Value, GlobalObject&, CallerMode, EvalMode);
  44. ThrowCompletionOr<void> eval_declaration_instantiation(VM& vm, GlobalObject& global_object, Program const& program, Environment* variable_environment, Environment* lexical_environment, PrivateEnvironment* private_environment, bool strict);
  45. // 7.3.13 Call ( F, V [ , argumentsList ] ), https://tc39.es/ecma262/#sec-call
  46. template<typename... Args>
  47. ALWAYS_INLINE ThrowCompletionOr<Value> call(GlobalObject& global_object, Value function, Value this_value, MarkedValueList arguments_list)
  48. {
  49. return call_impl(global_object, function, this_value, move(arguments_list));
  50. }
  51. template<typename... Args>
  52. ALWAYS_INLINE ThrowCompletionOr<Value> call(GlobalObject& global_object, Value function, Value this_value, Args... args)
  53. {
  54. if constexpr (sizeof...(Args) > 0) {
  55. MarkedValueList arguments_list { global_object.heap() };
  56. (..., arguments_list.append(move(args)));
  57. return call_impl(global_object, function, this_value, move(arguments_list));
  58. }
  59. return call_impl(global_object, function, this_value);
  60. }
  61. // 10.1.13 OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ), https://tc39.es/ecma262/#sec-ordinarycreatefromconstructor
  62. template<typename T, typename... Args>
  63. ThrowCompletionOr<T*> ordinary_create_from_constructor(GlobalObject& global_object, FunctionObject const& constructor, Object* (GlobalObject::*intrinsic_default_prototype)(), Args&&... args)
  64. {
  65. auto* prototype = TRY(get_prototype_from_constructor(global_object, constructor, intrinsic_default_prototype));
  66. return global_object.heap().allocate<T>(global_object, forward<Args>(args)..., *prototype);
  67. }
  68. }