summaryrefslogtreecommitdiff
path: root/Userland/Libraries
diff options
context:
space:
mode:
authorTimothy Flynn <trflynn89@pm.me>2021-07-10 22:53:54 -0400
committerLinus Groh <mail@linusgroh.de>2021-07-14 20:44:42 +0100
commita61723ec599be984523e40030c05e3a3f3af7e67 (patch)
tree00d725d64b5712f2e8b48ff5170eba6b6ff562b3 /Userland/Libraries
parentdf75c35d5ba62b99a8e2544a734e22bc4f81a394 (diff)
downloadserenity-a61723ec599be984523e40030c05e3a3f3af7e67.zip
LibJS: Begin implementing Atomics
This adds the Atomics object to the global object and sets up only its @@toStringTag property.
Diffstat (limited to 'Userland/Libraries')
-rw-r--r--Userland/Libraries/LibJS/CMakeLists.txt1
-rw-r--r--Userland/Libraries/LibJS/Runtime/AtomicsObject.cpp27
-rw-r--r--Userland/Libraries/LibJS/Runtime/AtomicsObject.h22
-rw-r--r--Userland/Libraries/LibJS/Runtime/CommonPropertyNames.h1
-rw-r--r--Userland/Libraries/LibJS/Runtime/GlobalObject.cpp2
-rw-r--r--Userland/Libraries/LibJS/Tests/builtins/Atomics/Atomics.@@toStringTag.js4
6 files changed, 57 insertions, 0 deletions
diff --git a/Userland/Libraries/LibJS/CMakeLists.txt b/Userland/Libraries/LibJS/CMakeLists.txt
index 286ea7f7b6..921ce02bac 100644
--- a/Userland/Libraries/LibJS/CMakeLists.txt
+++ b/Userland/Libraries/LibJS/CMakeLists.txt
@@ -35,6 +35,7 @@ set(SOURCES
Runtime/ArrayIterator.cpp
Runtime/ArrayIteratorPrototype.cpp
Runtime/ArrayPrototype.cpp
+ Runtime/AtomicsObject.cpp
Runtime/BigInt.cpp
Runtime/BigIntConstructor.cpp
Runtime/BigIntObject.cpp
diff --git a/Userland/Libraries/LibJS/Runtime/AtomicsObject.cpp b/Userland/Libraries/LibJS/Runtime/AtomicsObject.cpp
new file mode 100644
index 0000000000..a875043fe4
--- /dev/null
+++ b/Userland/Libraries/LibJS/Runtime/AtomicsObject.cpp
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2021, Tim Flynn <trflynn89@pm.me>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibJS/Runtime/AtomicsObject.h>
+#include <LibJS/Runtime/GlobalObject.h>
+
+namespace JS {
+
+AtomicsObject::AtomicsObject(GlobalObject& global_object)
+ : Object(*global_object.object_prototype())
+{
+}
+
+void AtomicsObject::initialize(GlobalObject& global_object)
+{
+ Object::initialize(global_object);
+
+ auto& vm = this->vm();
+
+ // 25.4.15 Atomics [ @@toStringTag ], https://tc39.es/ecma262/#sec-atomics-@@tostringtag
+ define_direct_property(*vm.well_known_symbol_to_string_tag(), js_string(global_object.heap(), "Atomics"), Attribute::Configurable);
+}
+
+}
diff --git a/Userland/Libraries/LibJS/Runtime/AtomicsObject.h b/Userland/Libraries/LibJS/Runtime/AtomicsObject.h
new file mode 100644
index 0000000000..db393e1213
--- /dev/null
+++ b/Userland/Libraries/LibJS/Runtime/AtomicsObject.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2021, Tim Flynn <trflynn89@pm.me>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibJS/Runtime/Object.h>
+
+namespace JS {
+
+class AtomicsObject : public Object {
+ JS_OBJECT(AtomicsObject, Object);
+
+public:
+ explicit AtomicsObject(GlobalObject&);
+ virtual void initialize(GlobalObject&) override;
+ virtual ~AtomicsObject() override = default;
+};
+
+}
diff --git a/Userland/Libraries/LibJS/Runtime/CommonPropertyNames.h b/Userland/Libraries/LibJS/Runtime/CommonPropertyNames.h
index 2c047727f8..530cca681e 100644
--- a/Userland/Libraries/LibJS/Runtime/CommonPropertyNames.h
+++ b/Userland/Libraries/LibJS/Runtime/CommonPropertyNames.h
@@ -17,6 +17,7 @@ namespace JS {
P(__defineSetter__) \
P(__lookupGetter__) \
P(__lookupSetter__) \
+ P(Atomics) \
P(BYTES_PER_ELEMENT) \
P(BigInt) \
P(Boolean) \
diff --git a/Userland/Libraries/LibJS/Runtime/GlobalObject.cpp b/Userland/Libraries/LibJS/Runtime/GlobalObject.cpp
index f64ebb9b45..2b729d4deb 100644
--- a/Userland/Libraries/LibJS/Runtime/GlobalObject.cpp
+++ b/Userland/Libraries/LibJS/Runtime/GlobalObject.cpp
@@ -20,6 +20,7 @@
#include <LibJS/Runtime/ArrayConstructor.h>
#include <LibJS/Runtime/ArrayIteratorPrototype.h>
#include <LibJS/Runtime/ArrayPrototype.h>
+#include <LibJS/Runtime/AtomicsObject.h>
#include <LibJS/Runtime/BigIntConstructor.h>
#include <LibJS/Runtime/BigIntPrototype.h>
#include <LibJS/Runtime/BooleanConstructor.h>
@@ -184,6 +185,7 @@ void GlobalObject::initialize_global_object()
define_direct_property(vm.names.globalThis, this, attr);
define_direct_property(vm.names.console, heap().allocate<ConsoleObject>(*this, *this), attr);
+ define_direct_property(vm.names.Atomics, heap().allocate<AtomicsObject>(*this, *this), attr);
define_direct_property(vm.names.Math, heap().allocate<MathObject>(*this, *this), attr);
define_direct_property(vm.names.JSON, heap().allocate<JSONObject>(*this, *this), attr);
define_direct_property(vm.names.Reflect, heap().allocate<ReflectObject>(*this, *this), attr);
diff --git a/Userland/Libraries/LibJS/Tests/builtins/Atomics/Atomics.@@toStringTag.js b/Userland/Libraries/LibJS/Tests/builtins/Atomics/Atomics.@@toStringTag.js
new file mode 100644
index 0000000000..6cdf79b4de
--- /dev/null
+++ b/Userland/Libraries/LibJS/Tests/builtins/Atomics/Atomics.@@toStringTag.js
@@ -0,0 +1,4 @@
+test("basic functionality", () => {
+ expect(Atomics[Symbol.toStringTag]).toBe("Atomics");
+ expect(Atomics.toString()).toBe("[object Atomics]");
+});