1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-30 17:28:10 +00:00
serenity/Userland/Libraries/LibJS/Runtime/ProxyObject.h
Andreas Kling aabd82d508 LibJS: Bring function environment records closer to the spec
This patch adds FunctionEnvironmentRecord as a subclass of the existing
DeclarativeEnvironmentRecord. Things that are specific to function
environment records move into there, simplifying the base.

Most of the abstract operations related to function environment records
are rewritten to match the spec exactly. I also had to implement
GetThisEnvironment() and GetSuperConstructor() to keep tests working
after the changes, so that's nice as well. :^)
2021-06-22 18:44:53 +02:00

59 lines
2.1 KiB
C++

/*
* Copyright (c) 2020, Matthew Olsson <mattco@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibJS/Runtime/Function.h>
namespace JS {
class ProxyObject final : public Function {
JS_OBJECT(ProxyObject, Function);
public:
static ProxyObject* create(GlobalObject&, Object& target, Object& handler);
ProxyObject(Object& target, Object& handler, Object& prototype);
virtual ~ProxyObject() override;
virtual Value call() override;
virtual Value construct(Function& new_target) override;
virtual const FlyString& name() const override;
virtual FunctionEnvironmentRecord* create_environment_record() override;
const Object& target() const { return m_target; }
const Object& handler() const { return m_handler; }
virtual Object* prototype() override;
virtual const Object* prototype() const override;
virtual bool set_prototype(Object* object) override;
virtual bool is_extensible() const override;
virtual bool prevent_extensions() override;
virtual Optional<PropertyDescriptor> get_own_property_descriptor(const PropertyName&) const override;
virtual bool define_property(const StringOrSymbol& property_name, const Object& descriptor, bool throw_exceptions = true) override;
virtual bool has_property(const PropertyName& name) const override;
virtual Value get(const PropertyName& name, Value receiver, AllowSideEffects = AllowSideEffects::Yes) const override;
virtual bool put(const PropertyName& name, Value value, Value receiver) override;
virtual bool delete_property(const PropertyName& name) override;
bool is_revoked() const { return m_is_revoked; }
void revoke() { m_is_revoked = true; }
private:
virtual void visit_edges(Visitor&) override;
virtual bool is_function() const override { return m_target.is_function(); }
virtual bool is_proxy_object() const final { return true; }
Object& m_target;
Object& m_handler;
bool m_is_revoked { false };
};
template<>
inline bool Object::fast_is<ProxyObject>() const { return is_proxy_object(); }
}