Script has a Handle member (m_realm), and for handles to remain valid, the VM must stay alive.
@@ -30,7 +30,8 @@ NonnullRefPtr<Script> Script::parse(StringView source_text, Realm& realm, String
}
Script::Script(Realm& realm, NonnullRefPtr<Program> parse_node)
- : m_realm(make_handle(&realm))
+ : m_vm(realm.vm())
+ , m_realm(make_handle(&realm))
, m_parse_node(move(parse_node))
{
@@ -26,6 +26,9 @@ public:
private:
Script(Realm&, NonnullRefPtr<Program>);
+ // Handles are not safe unless we keep the VM alive.
+ NonnullRefPtr<VM> m_vm;
+
Handle<Realm> m_realm; // [[Realm]]
NonnullRefPtr<Program> m_parse_node; // [[ECMAScriptCode]]
};