PromiseAllResolveElementFunction.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*
  2. * Copyright (c) 2021, Tim Flynn <trflynn89@pm.me>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibJS/Runtime/AbstractOperations.h>
  7. #include <LibJS/Runtime/Array.h>
  8. #include <LibJS/Runtime/GlobalObject.h>
  9. #include <LibJS/Runtime/PromiseAllResolveElementFunction.h>
  10. #include <LibJS/Runtime/PromiseReaction.h>
  11. namespace JS {
  12. PromiseAllResolveElementFunction* PromiseAllResolveElementFunction::create(GlobalObject& global_object, size_t index, PromiseValueList& values, PromiseCapability capability, RemainingElements& remaining_elements)
  13. {
  14. return global_object.heap().allocate<PromiseAllResolveElementFunction>(global_object, index, values, capability, remaining_elements, *global_object.function_prototype());
  15. }
  16. PromiseAllResolveElementFunction::PromiseAllResolveElementFunction(size_t index, PromiseValueList& values, PromiseCapability capability, RemainingElements& remaining_elements, Object& prototype)
  17. : NativeFunction(prototype)
  18. , m_index(index)
  19. , m_values(values)
  20. , m_capability(move(capability))
  21. , m_remaining_elements(remaining_elements)
  22. {
  23. }
  24. void PromiseAllResolveElementFunction::initialize(GlobalObject& global_object)
  25. {
  26. Base::initialize(global_object);
  27. define_direct_property(vm().names.length, Value(1), Attribute::Configurable);
  28. }
  29. Value PromiseAllResolveElementFunction::call()
  30. {
  31. auto& vm = this->vm();
  32. auto& global_object = this->global_object();
  33. if (m_already_called)
  34. return js_undefined();
  35. m_already_called = true;
  36. m_values.values[m_index] = vm.argument(0);
  37. if (--m_remaining_elements.value == 0) {
  38. auto values_array = Array::create_from(global_object, m_values.values);
  39. return vm.call(*m_capability.resolve, js_undefined(), values_array);
  40. }
  41. return js_undefined();
  42. }
  43. void PromiseAllResolveElementFunction::visit_edges(Cell::Visitor& visitor)
  44. {
  45. Base::visit_edges(visitor);
  46. visitor.visit(&m_values);
  47. visitor.visit(m_capability.promise);
  48. visitor.visit(m_capability.resolve);
  49. visitor.visit(m_capability.reject);
  50. visitor.visit(&m_remaining_elements);
  51. }
  52. }