【问题标题】:How do you fully Reinitialize an embedded ruby VM in a C (actually swift) application?您如何在 C(实际上是 swift)应用程序中完全重新初始化嵌入式 ruby​​ VM?
【发布时间】:2017-01-07 22:55:06
【问题描述】:

我正在使用 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()

我应该如何重新初始化?

【问题讨论】:

    标签: ruby swift ruby-c-extension embedded-ruby mri


    【解决方案1】:

    Ruby 的 VM 在关闭后无法重新初始化,因为 ruby_cleanupruby_finalize 不会将其返回到可重用的原始状态,而仅用于以优雅的方式将其关闭。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-06
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      相关资源
      最近更新 更多