BoundFunction.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /*
  2. * Copyright (c) 2020, Jack Karamanian <karamanian.jack@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibJS/Runtime/BoundFunction.h>
  7. #include <LibJS/Runtime/GlobalObject.h>
  8. namespace JS {
  9. BoundFunction::BoundFunction(GlobalObject& global_object, FunctionObject& bound_target_function, Value bound_this, Vector<Value> bound_arguments, i32 length, Object* constructor_prototype)
  10. : FunctionObject(*global_object.function_prototype())
  11. , m_bound_target_function(&bound_target_function)
  12. , m_bound_this(bound_this)
  13. , m_bound_arguments(move(bound_arguments))
  14. , m_constructor_prototype(constructor_prototype)
  15. , m_name(String::formatted("bound {}", bound_target_function.name()))
  16. , m_length(length)
  17. {
  18. }
  19. void BoundFunction::initialize(GlobalObject& global_object)
  20. {
  21. auto& vm = this->vm();
  22. Base::initialize(global_object);
  23. define_direct_property(vm.names.length, Value(m_length), Attribute::Configurable);
  24. }
  25. BoundFunction::~BoundFunction()
  26. {
  27. }
  28. Value BoundFunction::call()
  29. {
  30. return m_bound_target_function->call();
  31. }
  32. Value BoundFunction::construct(FunctionObject& new_target)
  33. {
  34. if (auto this_value = vm().this_value(global_object()); m_constructor_prototype && this_value.is_object())
  35. TRY_OR_DISCARD(this_value.as_object().internal_set_prototype_of(m_constructor_prototype));
  36. return m_bound_target_function->construct(new_target);
  37. }
  38. FunctionEnvironment* BoundFunction::create_environment(FunctionObject& function_being_invoked)
  39. {
  40. return m_bound_target_function->create_environment(function_being_invoked);
  41. }
  42. void BoundFunction::visit_edges(Visitor& visitor)
  43. {
  44. Base::visit_edges(visitor);
  45. visitor.visit(m_bound_target_function);
  46. visitor.visit(m_bound_this);
  47. for (auto argument : m_bound_arguments)
  48. visitor.visit(argument);
  49. visitor.visit(m_constructor_prototype);
  50. }
  51. }