1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 00:17:46 +00:00

LibJS: Add Interpreter::create<GlobalObjectType>()

Force Interpreter construction to go via a create() helper that takes
the global object type as a template parameter.
This commit is contained in:
Andreas Kling 2020-04-01 21:04:51 +02:00
parent aee4c1f583
commit 9d5d0261e1
3 changed files with 16 additions and 17 deletions

View file

@ -68,16 +68,16 @@ struct Argument {
class Interpreter {
public:
Interpreter();
~Interpreter();
template<typename T, typename... Args>
void initialize_global_object(Args&&... args)
template<typename GlobalObjectType, typename... Args>
static NonnullOwnPtr<Interpreter> create(Args&&... args)
{
ASSERT(!m_global_object);
m_global_object = heap().allocate<T>(forward<Args>(args)...);
auto interpreter = adopt_own(*new Interpreter);
interpreter->m_global_object = interpreter->heap().allocate<GlobalObjectType>(forward<Args>(args)...);
return interpreter;
}
~Interpreter();
Value run(const Statement&, Vector<Argument> = {}, ScopeType = ScopeType::Block);
Object& global_object() { return *m_global_object; }
@ -136,6 +136,8 @@ public:
}
private:
Interpreter();
Heap m_heap;
Vector<ScopeFrame> m_scope_stack;

View file

@ -360,10 +360,8 @@ Color Document::visited_link_color() const
JS::Interpreter& Document::interpreter()
{
if (!m_interpreter) {
m_interpreter = make<JS::Interpreter>();
m_interpreter->initialize_global_object<Bindings::WindowObject>(*m_window);
}
if (!m_interpreter)
m_interpreter = JS::Interpreter::create<Bindings::WindowObject>(*m_window);
return *m_interpreter;
}