| 
									
										
										
										
											2020-11-28 16:14:26 +01:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2021-06-21 23:17:24 +02:00
										 |  |  |  * Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org> | 
					
						
							| 
									
										
										
										
											2020-11-28 16:14:26 +01:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2021-04-22 01:24:48 -07:00
										 |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							| 
									
										
										
										
											2020-11-28 16:14:26 +01:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-01 12:24:46 +02:00
										 |  |  | #include <LibJS/Runtime/Environment.h>
 | 
					
						
							| 
									
										
										
										
											2020-11-28 16:14:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace JS { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-01 12:24:46 +02:00
										 |  |  | class ObjectEnvironment : public Environment { | 
					
						
							|  |  |  |     JS_ENVIRONMENT(ObjectEnvironment, Environment); | 
					
						
							| 
									
										
										
										
											2020-11-28 16:14:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2021-06-24 13:24:44 +02:00
										 |  |  |     enum class IsWithEnvironment { | 
					
						
							|  |  |  |         No, | 
					
						
							|  |  |  |         Yes, | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2021-07-01 12:24:46 +02:00
										 |  |  |     ObjectEnvironment(Object& binding_object, IsWithEnvironment, Environment* outer_environment); | 
					
						
							| 
									
										
										
										
											2020-11-28 16:14:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-23 12:26:37 +02:00
										 |  |  |     virtual bool has_binding(FlyString const& name) const override; | 
					
						
							|  |  |  |     virtual void create_mutable_binding(GlobalObject&, FlyString const& name, bool can_be_deleted) override; | 
					
						
							|  |  |  |     virtual void create_immutable_binding(GlobalObject&, FlyString const& name, bool strict) override; | 
					
						
							|  |  |  |     virtual void initialize_binding(GlobalObject&, FlyString const& name, Value) override; | 
					
						
							|  |  |  |     virtual void set_mutable_binding(GlobalObject&, FlyString const& name, Value, bool strict) override; | 
					
						
							|  |  |  |     virtual Value get_binding_value(GlobalObject&, FlyString const& name, bool strict) override; | 
					
						
							|  |  |  |     virtual bool delete_binding(GlobalObject&, FlyString const& name) override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-24 13:24:44 +02:00
										 |  |  |     // 9.1.1.2.10 WithBaseObject ( ), https://tc39.es/ecma262/#sec-object-environment-records-withbaseobject
 | 
					
						
							|  |  |  |     virtual Object* with_base_object() const override | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (is_with_environment()) | 
					
						
							| 
									
										
										
										
											2021-06-26 10:38:36 +02:00
										 |  |  |             return &m_binding_object; | 
					
						
							| 
									
										
										
										
											2021-06-24 13:24:44 +02:00
										 |  |  |         return nullptr; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-26 10:38:36 +02:00
										 |  |  |     // [[BindingObject]], The binding object of this Environment Record.
 | 
					
						
							|  |  |  |     Object& binding_object() { return m_binding_object; } | 
					
						
							| 
									
										
										
										
											2021-06-24 13:24:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-26 10:38:36 +02:00
										 |  |  |     // [[IsWithEnvironment]], Indicates whether this Environment Record is created for a with statement.
 | 
					
						
							|  |  |  |     bool is_with_environment() const { return m_with_environment; } | 
					
						
							| 
									
										
										
										
											2021-06-22 17:16:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-28 16:14:26 +01:00
										 |  |  | private: | 
					
						
							|  |  |  |     virtual void visit_edges(Visitor&) override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-26 10:38:36 +02:00
										 |  |  |     Object& m_binding_object; | 
					
						
							| 
									
										
										
										
											2021-06-24 13:24:44 +02:00
										 |  |  |     bool m_with_environment { false }; | 
					
						
							| 
									
										
										
										
											2020-11-28 16:14:26 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |