如何在C(实际上是快速)应用程序中完全重新初始化嵌入式ruby VM?

时间:2017-01-07 22:55:06

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

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

我觉得Ruby 必须有一些完全重新初始化的方法。

我正在初始化vm:

 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()))
}

并像这样摧毁vm:

    var state: Int32 = 0
    ruby_cleanup(state)

然而,第二次执行所有操作时,我在运行时获得EXC_BAD_ACCESSruby_init_loadpath()

我该如何重新启动?

1 个答案:

答案 0 :(得分:0)

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

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