diff --git a/packages/libivm-v8/include/realm.cc b/packages/libivm-v8/include/realm.cc index d00f0e41..53257eb4 100644 --- a/packages/libivm-v8/include/realm.cc +++ b/packages/libivm-v8/include/realm.cc @@ -24,11 +24,12 @@ class realm::scope : util::non_copyable { scope() = delete; scope(agent::lock& agent, v8::Local context); - [[nodiscard]] auto context() const -> v8::Local { return context_; } - [[nodiscard]] auto isolate() const -> v8::Isolate* { return isolate_; } + [[nodiscard]] auto agent() const -> agent::lock&; + [[nodiscard]] auto context() const -> v8::Local; + [[nodiscard]] auto isolate() const -> v8::Isolate*; private: - v8::Isolate* isolate_; + agent::lock* agent_lock_; v8::Local context_; }; diff --git a/packages/libivm-v8/include/script.cc b/packages/libivm-v8/include/script.cc index f153ad25..c6aa825e 100644 --- a/packages/libivm-v8/include/script.cc +++ b/packages/libivm-v8/include/script.cc @@ -1,3 +1,5 @@ +module; +#include export module ivm.isolated_v8:script; import :agent; import :realm; @@ -11,7 +13,7 @@ namespace ivm { export class script : util::non_copyable { public: script() = delete; - script(v8::Isolate* isolate, v8::Local script); + script(agent::lock& agent, v8::Local script); auto run(realm::scope& realm_scope) -> value::value_t; static auto compile(agent::lock& agent, auto&& code_string) -> script; @@ -23,8 +25,8 @@ export class script : util::non_copyable { }; auto script::compile(agent::lock& agent, auto&& code_string) -> script { - auto local_string = value::transfer_strict>(code_string, agent->isolate()); - return script::compile(agent, local_string); + auto local_code_string = value::transfer_strict>(std::forward(code_string), agent->isolate()); + return script::compile(agent, local_code_string); } } // namespace ivm diff --git a/packages/libivm-v8/realm.cc b/packages/libivm-v8/realm.cc index 64a836c8..1afc5550 100644 --- a/packages/libivm-v8/realm.cc +++ b/packages/libivm-v8/realm.cc @@ -16,10 +16,22 @@ auto realm::make(agent::lock& agent) -> realm { } realm::scope::scope(agent::lock& agent, v8::Local context) : - isolate_{agent->isolate()}, + agent_lock_{&agent}, context_{context} { } +auto realm::scope::agent() const -> agent::lock& { + return *agent_lock_; +} + +auto realm::scope::context() const -> v8::Local { + return context_; +} + +auto realm::scope::isolate() const -> v8::Isolate* { + return (*agent_lock_)->isolate(); +} + realm::managed_scope::managed_scope(agent::lock& agent, realm& realm) : scope{agent, v8::Local::New(agent->isolate(), realm.context)}, context_scope{context()} { diff --git a/packages/libivm-v8/script.cc b/packages/libivm-v8/script.cc index 74a02a78..fe71da57 100644 --- a/packages/libivm-v8/script.cc +++ b/packages/libivm-v8/script.cc @@ -8,8 +8,8 @@ import v8; namespace ivm { -script::script(v8::Isolate* isolate, v8::Local script) : - unbound_script_{isolate, script} { +script::script(agent::lock& agent, v8::Local script) : + unbound_script_{agent->isolate(), script} { } auto script::run(realm::scope& realm_scope) -> value::value_t { @@ -26,7 +26,7 @@ auto script::compile(agent::lock& agent, v8::Local code_string) -> s v8::ScriptCompiler::Source source{code_string}; auto* isolate = agent->isolate(); auto script_handle = v8::ScriptCompiler::CompileUnboundScript(isolate, &source).ToLocalChecked(); - return script{isolate, script_handle}; + return script{agent, script_handle}; } } // namespace ivm