NativeFunction.h 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Function.h>
  8. #include <LibJS/Runtime/Completion.h>
  9. #include <LibJS/Runtime/FunctionObject.h>
  10. namespace JS {
  11. class NativeFunction : public FunctionObject {
  12. JS_OBJECT(NativeFunction, FunctionObject);
  13. public:
  14. static NativeFunction* create(GlobalObject&, const FlyString& name, Function<ThrowCompletionOr<Value>(VM&, GlobalObject&)>);
  15. explicit NativeFunction(FlyString name, Function<ThrowCompletionOr<Value>(VM&, GlobalObject&)>, Object& prototype);
  16. virtual void initialize(GlobalObject&) override { }
  17. virtual ~NativeFunction() override;
  18. virtual ThrowCompletionOr<Value> internal_call(Value this_argument, MarkedValueList arguments_list) override;
  19. virtual ThrowCompletionOr<Object*> internal_construct(MarkedValueList arguments_list, FunctionObject& new_target) override;
  20. // Used for [[Call]] / [[Construct]]'s "...result of evaluating F in a manner that conforms to the specification of F".
  21. // Needs to be overridden by all NativeFunctions without an m_native_function.
  22. virtual ThrowCompletionOr<Value> call();
  23. virtual ThrowCompletionOr<Object*> construct(FunctionObject& new_target);
  24. virtual const FlyString& name() const override { return m_name; };
  25. virtual bool is_strict_mode() const override;
  26. virtual bool has_constructor() const override { return false; }
  27. virtual Realm* realm() const override { return m_realm; }
  28. protected:
  29. NativeFunction(FlyString name, Object& prototype);
  30. explicit NativeFunction(Object& prototype);
  31. private:
  32. virtual bool is_native_function() const final { return true; }
  33. FlyString m_name;
  34. Function<ThrowCompletionOr<Value>(VM&, GlobalObject&)> m_native_function;
  35. Realm* m_realm { nullptr };
  36. };
  37. template<>
  38. inline bool Object::fast_is<NativeFunction>() const { return is_native_function(); }
  39. }