DisposableStackConstructor.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. /*
  2. * Copyright (c) 2022, David Tuin <davidot@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibJS/Runtime/AbstractOperations.h>
  7. #include <LibJS/Runtime/DisposableStack.h>
  8. #include <LibJS/Runtime/DisposableStackConstructor.h>
  9. namespace JS {
  10. DisposableStackConstructor::DisposableStackConstructor(Realm& realm)
  11. : NativeFunction(realm.vm().names.DisposableStack.as_string(), realm.intrinsics().function_prototype())
  12. {
  13. }
  14. void DisposableStackConstructor::initialize(Realm& realm)
  15. {
  16. auto& vm = this->vm();
  17. Base::initialize(realm);
  18. // 26.2.2.1 DisposableStack.prototype, https://tc39.es/ecma262/#sec-finalization-registry.prototype
  19. define_direct_property(vm.names.prototype, realm.intrinsics().disposable_stack_prototype(), 0);
  20. define_direct_property(vm.names.length, Value(0), Attribute::Configurable);
  21. }
  22. // 11.3.1.1 DisposableStack ( ), https://tc39.es/proposal-explicit-resource-management/#sec-disposablestack
  23. ThrowCompletionOr<Value> DisposableStackConstructor::call()
  24. {
  25. auto& vm = this->vm();
  26. // 1. If NewTarget is undefined, throw a TypeError exception.
  27. return vm.throw_completion<TypeError>(ErrorType::ConstructorWithoutNew, vm.names.DisposableStack);
  28. }
  29. // 11.3.1.1 DisposableStack ( ), https://tc39.es/proposal-explicit-resource-management/#sec-disposablestack
  30. ThrowCompletionOr<NonnullGCPtr<Object>> DisposableStackConstructor::construct(FunctionObject& new_target)
  31. {
  32. auto& vm = this->vm();
  33. // 2. Let disposableStack be ? OrdinaryCreateFromConstructor(NewTarget, "%DisposableStack.prototype%", « [[DisposableState]], [[DisposableResourceStack]] »).
  34. // 3. Set disposableStack.[[DisposableState]] to pending.
  35. // 4. Set disposableStack.[[DisposableResourceStack]] to a new empty List.
  36. // 5. Return disposableStack.
  37. return TRY(ordinary_create_from_constructor<DisposableStack>(vm, new_target, &Intrinsics::disposable_stack_prototype, Vector<DisposableResource> {}));
  38. }
  39. }