summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-03-15 15:11:13 +0100
committerAndreas Kling <kling@serenityos.org>2020-03-15 15:11:13 +0100
commit8dc6416bbadfadec000ffeac6559caaeda14569b (patch)
tree0adb86c6ae8f26594d99ce8b988b10fc7e491f1e
parent9b4358e150a10d75f3cee2ef6dac336c7fb9ca06 (diff)
downloadserenity-8dc6416bbadfadec000ffeac6559caaeda14569b.zip
LibJS: Use the same StringPrototype globally
To make sure that everyone has the same instance of StringPrototype, hang a global prototype off of the Interpreter that can be fetched when constructing new StringObjects.
-rw-r--r--Libraries/LibJS/Interpreter.cpp3
-rw-r--r--Libraries/LibJS/Interpreter.h3
-rw-r--r--Libraries/LibJS/StringObject.cpp3
3 files changed, 8 insertions, 1 deletions
diff --git a/Libraries/LibJS/Interpreter.cpp b/Libraries/LibJS/Interpreter.cpp
index f08839d5d2..903f7fbc9f 100644
--- a/Libraries/LibJS/Interpreter.cpp
+++ b/Libraries/LibJS/Interpreter.cpp
@@ -30,6 +30,7 @@
#include <LibJS/Interpreter.h>
#include <LibJS/NativeFunction.h>
#include <LibJS/Object.h>
+#include <LibJS/StringPrototype.h>
#include <LibJS/Value.h>
namespace JS {
@@ -38,6 +39,7 @@ Interpreter::Interpreter()
: m_heap(*this)
{
m_global_object = heap().allocate<GlobalObject>();
+ m_string_prototype = heap().allocate<StringPrototype>();
}
Interpreter::~Interpreter()
@@ -137,6 +139,7 @@ Value Interpreter::get_variable(const String& name)
void Interpreter::collect_roots(Badge<Heap>, HashTable<Cell*>& roots)
{
roots.set(m_global_object);
+ roots.set(m_string_prototype);
for (auto& scope : m_scope_stack) {
for (auto& it : scope.variables) {
diff --git a/Libraries/LibJS/Interpreter.h b/Libraries/LibJS/Interpreter.h
index 79940cac3a..305e6a105e 100644
--- a/Libraries/LibJS/Interpreter.h
+++ b/Libraries/LibJS/Interpreter.h
@@ -88,6 +88,8 @@ public:
return m_this_stack.last();
}
+ Object* string_prototype() { return m_string_prototype; }
+
private:
Heap m_heap;
@@ -95,6 +97,7 @@ private:
Vector<Value> m_this_stack;
Object* m_global_object { nullptr };
+ Object* m_string_prototype { nullptr };
};
}
diff --git a/Libraries/LibJS/StringObject.cpp b/Libraries/LibJS/StringObject.cpp
index fbb1ec32f3..6eb09ff4f2 100644
--- a/Libraries/LibJS/StringObject.cpp
+++ b/Libraries/LibJS/StringObject.cpp
@@ -25,6 +25,7 @@
*/
#include <LibJS/Heap.h>
+#include <LibJS/Interpreter.h>
#include <LibJS/PrimitiveString.h>
#include <LibJS/StringObject.h>
#include <LibJS/StringPrototype.h>
@@ -35,7 +36,7 @@ namespace JS {
StringObject::StringObject(PrimitiveString* string)
: m_string(string)
{
- set_prototype(heap().allocate<StringPrototype>());
+ set_prototype(interpreter().string_prototype());
put("length", Value(static_cast<i32>(m_string->string().length())));
}