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.
This commit is contained in:
parent
9b4358e150
commit
8dc6416bba
Notes:
sideshowbarker
2024-07-19 08:17:51 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/8dc6416bbad
3 changed files with 8 additions and 1 deletions
|
@ -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) {
|
||||
|
|
|
@ -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 };
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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())));
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue