浏览代码

LibJS: Implement the NewDeclarativeEnvironment() abstract operation

Andreas Kling 4 年之前
父节点
当前提交
d8e9a176cd

+ 9 - 0
Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2020-2021, Linus Groh <linusg@serenityos.org>
+ * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
  *
  * SPDX-License-Identifier: BSD-2-Clause
  */
@@ -8,6 +9,7 @@
 #include <AK/Result.h>
 #include <LibJS/Runtime/AbstractOperations.h>
 #include <LibJS/Runtime/BoundFunction.h>
+#include <LibJS/Runtime/DeclarativeEnvironmentRecord.h>
 #include <LibJS/Runtime/ErrorTypes.h>
 #include <LibJS/Runtime/Function.h>
 #include <LibJS/Runtime/GlobalObject.h>
@@ -156,4 +158,11 @@ Object* get_prototype_from_constructor(GlobalObject& global_object, Function con
     return &prototype.as_object();
 }
 
+// 9.1.2.2 NewDeclarativeEnvironment ( E ), https://tc39.es/ecma262/#sec-newdeclarativeenvironment
+DeclarativeEnvironmentRecord* new_declarative_environment(EnvironmentRecord& environment_record)
+{
+    auto& global_object = environment_record.global_object();
+    return global_object.heap().allocate<DeclarativeEnvironmentRecord>(global_object, &environment_record);
+}
+
 }

+ 1 - 0
Userland/Libraries/LibJS/Runtime/AbstractOperations.h

@@ -13,6 +13,7 @@
 
 namespace JS {
 
+DeclarativeEnvironmentRecord* new_declarative_environment(EnvironmentRecord&);
 Value require_object_coercible(GlobalObject&, Value);
 Function* get_method(GlobalObject& global_object, Value, PropertyName const&);
 size_t length_of_array_like(GlobalObject&, Object const&);

+ 5 - 0
Userland/Libraries/LibJS/Runtime/DeclarativeEnvironmentRecord.cpp

@@ -24,6 +24,11 @@ DeclarativeEnvironmentRecord::DeclarativeEnvironmentRecord(EnvironmentRecordType
 {
 }
 
+DeclarativeEnvironmentRecord::DeclarativeEnvironmentRecord(EnvironmentRecord* parent_scope)
+    : EnvironmentRecord(parent_scope)
+{
+}
+
 DeclarativeEnvironmentRecord::DeclarativeEnvironmentRecord(HashMap<FlyString, Variable> variables, EnvironmentRecord* parent_scope)
     : EnvironmentRecord(parent_scope)
     , m_variables(move(variables))

+ 1 - 0
Userland/Libraries/LibJS/Runtime/DeclarativeEnvironmentRecord.h

@@ -32,6 +32,7 @@ public:
 
     DeclarativeEnvironmentRecord();
     DeclarativeEnvironmentRecord(EnvironmentRecordType);
+    explicit DeclarativeEnvironmentRecord(EnvironmentRecord* parent_scope);
     DeclarativeEnvironmentRecord(HashMap<FlyString, Variable> variables, EnvironmentRecord* parent_scope);
     DeclarativeEnvironmentRecord(HashMap<FlyString, Variable> variables, EnvironmentRecord* parent_scope, EnvironmentRecordType);
     virtual ~DeclarativeEnvironmentRecord() override;