ladybird/Userland/Libraries/LibJS/Runtime/FunctionEnvironmentRecord.h
Andreas Kling 9ccc2f6c4d LibJS: Make EnvironmentRecord inherit directly from Cell
Previously, EnvironmentRecord was a JS::Object. This was done because
GlobalObject inherited from EnvironmentRecord. Now that this is no
longer the case, we can simplify things by making EnvironmentRecord
inherit from Cell directly.

This also removes the need for environment records to have a shape,
which was awkward. This will be removed in the following patch.
2021-06-23 13:08:27 +02:00

66 lines
2.2 KiB
C++

/*
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibJS/Runtime/DeclarativeEnvironmentRecord.h>
namespace JS {
class FunctionEnvironmentRecord final : public DeclarativeEnvironmentRecord {
JS_ENVIRONMENT_RECORD(FunctionEnvironmentRecord, DeclarativeEnvironmentRecord);
public:
enum class ThisBindingStatus : u8 {
Lexical,
Initialized,
Uninitialized,
};
FunctionEnvironmentRecord(EnvironmentRecord* parent_scope, HashMap<FlyString, Variable> variables);
virtual ~FunctionEnvironmentRecord() override;
// [[ThisValue]]
Value this_value() const { return m_this_value; }
void set_this_value(Value value) { m_this_value = value; }
// Not a standard operation.
void replace_this_binding(Value this_value) { m_this_value = this_value; }
// [[ThisBindingStatus]]
ThisBindingStatus this_binding_status() const { return m_this_binding_status; }
void set_this_binding_status(ThisBindingStatus status) { m_this_binding_status = status; }
// [[FunctionObject]]
Function& function_object() { return *m_function_object; }
Function const& function_object() const { return *m_function_object; }
void set_function_object(Function& function) { m_function_object = &function; }
// [[NewTarget]]
Value new_target() const { return m_new_target; }
void set_new_target(Value new_target) { m_new_target = new_target; }
// Abstract operations
Value get_super_base() const;
bool has_super_binding() const;
virtual bool has_this_binding() const override;
virtual Value get_this_binding(GlobalObject&) const override;
Value bind_this_value(GlobalObject&, Value);
private:
virtual bool is_function_environment_record() const override { return true; }
virtual void visit_edges(Visitor&) override;
Value m_this_value;
ThisBindingStatus m_this_binding_status { ThisBindingStatus::Uninitialized };
Function* m_function_object { nullptr };
Value m_new_target;
};
template<>
inline bool EnvironmentRecord::fast_is<FunctionEnvironmentRecord>() const { return is_function_environment_record(); }
}