BoundFunction.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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& target_function, Value bound_this, Vector<Value> arguments, i32 length, Object* constructor_prototype)
  10. : FunctionObject(bound_this, move(arguments), *global_object.function_prototype())
  11. , m_target_function(&target_function)
  12. , m_constructor_prototype(constructor_prototype)
  13. , m_name(String::formatted("bound {}", target_function.name()))
  14. , m_length(length)
  15. {
  16. }
  17. void BoundFunction::initialize(GlobalObject& global_object)
  18. {
  19. auto& vm = this->vm();
  20. Base::initialize(global_object);
  21. define_direct_property(vm.names.length, Value(m_length), Attribute::Configurable);
  22. }
  23. BoundFunction::~BoundFunction()
  24. {
  25. }
  26. Value BoundFunction::call()
  27. {
  28. return m_target_function->call();
  29. }
  30. Value BoundFunction::construct(FunctionObject& new_target)
  31. {
  32. if (auto this_value = vm().this_value(global_object()); m_constructor_prototype && this_value.is_object()) {
  33. this_value.as_object().internal_set_prototype_of(m_constructor_prototype);
  34. if (vm().exception())
  35. return {};
  36. }
  37. return m_target_function->construct(new_target);
  38. }
  39. FunctionEnvironment* BoundFunction::create_environment(FunctionObject& function_being_invoked)
  40. {
  41. return m_target_function->create_environment(function_being_invoked);
  42. }
  43. void BoundFunction::visit_edges(Visitor& visitor)
  44. {
  45. Base::visit_edges(visitor);
  46. visitor.visit(m_target_function);
  47. visitor.visit(m_constructor_prototype);
  48. }
  49. }