1

我正在使用 C Ruby 接口在 swift 应用程序中嵌入一个 ruby​​ 解释器(尽管,我使用的 swift 与 Imo 无关)

我觉得 Ruby必须有某种方式来完全重新初始化自己。

我正在像这样初始化虚拟机:

 var variable_in_this_stack_frame:UnsafeMutablePointer<VALUE>? = nil
 ruby_init_stack(variable_in_this_stack_frame)
 ruby_init()
 ruby_init_loadpath()
 rb_require("enc/encdb")
 rb_require("enc/trans/transdb")
 var node = ruby_options(Int32(options.count), &cargs)

评估一些代码:

var state: Int32 = 0;
if ruby_executable_node(node, &state) != 0 {
   state = ruby_exec_node(node)
}
if state != 0 {
   throw RubyError(err: RTypedValue(VALUE: rb_errinfo()))
}

并像这样破坏虚拟机:

    var state: Int32 = 0
    ruby_cleanup(state)

然而,第二次做这一切,我EXC_BAD_ACCESS在跑步时得到:ruby_init_loadpath()

我应该如何重新启动?

4

1 回答 1

0

关闭 Ruby 的 VM 后无法重新初始化它,因为 ruby_cleanup并且ruby_finalize不要将其返回到可重用的原始状态,并且仅用于以优雅的方式将其关闭。

唯一真正的选择是生成一个新进程,这可能不太理想,具体取决于您的实施。我不是 100% 确定在不同的线程上再次尝试是否是一个可行的选择,尽管我认为由于 Ruby VM 的单线程性质,这极不可能。

于 2019-08-09T23:04:06.053 回答