summaryrefslogtreecommitdiff
path: root/Libraries/LibJS/Runtime/LexicalEnvironment.h
diff options
context:
space:
mode:
Diffstat (limited to 'Libraries/LibJS/Runtime/LexicalEnvironment.h')
-rw-r--r--Libraries/LibJS/Runtime/LexicalEnvironment.h43
1 files changed, 42 insertions, 1 deletions
diff --git a/Libraries/LibJS/Runtime/LexicalEnvironment.h b/Libraries/LibJS/Runtime/LexicalEnvironment.h
index c2cf3d8651..a4c9deda13 100644
--- a/Libraries/LibJS/Runtime/LexicalEnvironment.h
+++ b/Libraries/LibJS/Runtime/LexicalEnvironment.h
@@ -40,11 +40,27 @@ struct Variable {
class LexicalEnvironment final : public Cell {
public:
+ enum class ThisBindingStatus {
+ Lexical,
+ Initialized,
+ Uninitialized,
+ };
+
+ enum class EnvironmentRecordType {
+ Declarative,
+ Function,
+ Global,
+ Object,
+ Module,
+ };
+
LexicalEnvironment();
+ LexicalEnvironment(EnvironmentRecordType);
LexicalEnvironment(HashMap<FlyString, Variable> variables, LexicalEnvironment* parent);
+ LexicalEnvironment(HashMap<FlyString, Variable> variables, LexicalEnvironment* parent, EnvironmentRecordType);
virtual ~LexicalEnvironment() override;
- LexicalEnvironment* parent() { return m_parent; }
+ LexicalEnvironment* parent() const { return m_parent; }
Optional<Variable> get(const FlyString&) const;
void set(const FlyString&, Variable);
@@ -53,12 +69,37 @@ public:
const HashMap<FlyString, Variable>& variables() const { return m_variables; }
+ void set_home_object(Value object) { m_home_object = object; }
+ bool has_super_binding() const;
+ Value get_super_base();
+
+ bool has_this_binding() const;
+ ThisBindingStatus this_binding_status() const { return m_this_binding_status; }
+ Value get_this_binding() const;
+ void bind_this_value(Value this_value);
+
+ // Not a standard operation.
+ void replace_this_binding(Value this_value) { m_this_value = this_value; }
+
+ Value new_target() const { return m_new_target; };
+ void set_new_target(Value new_target) { m_new_target = new_target; }
+
+ Function* current_function() const { return m_current_function; }
+ void set_current_function(Function& function) { m_current_function = &function; }
+
private:
virtual const char* class_name() const override { return "LexicalEnvironment"; }
virtual void visit_children(Visitor&) override;
LexicalEnvironment* m_parent { nullptr };
HashMap<FlyString, Variable> m_variables;
+ EnvironmentRecordType m_environment_record_type = EnvironmentRecordType::Declarative;
+ ThisBindingStatus m_this_binding_status = ThisBindingStatus::Uninitialized;
+ Value m_home_object;
+ Value m_this_value;
+ Value m_new_target;
+ // Corresponds to [[FunctionObject]]
+ Function* m_current_function { nullptr };
};
}