重置嵌入式ruby解释器的状态
Reset state of embedded ruby interpreter
我有一个可以用Ruby扩展的应用程序。脚本可以在应用程序本身中创建,每次编辑时都会重新加载。因此,当用户向类中添加方法时,它会立即生效。我不能只执行修改后的文件,就像用户删除了一个方法一样,它将不执行。唯一的选择是清除解释器的状态并重新加载所有脚本。但Ruby保护自己不重启:(eval.c
)
void ruby_init(void)
{
int state = ruby_setup();
if (state) {
error_print();
exit(EXIT_FAILURE);
}
}
int ruby_setup(void)
{
static int initialized = 0;
int state;
if (initialized)
return 0;
initialized = 1;
/* ... */
return state;
}
我还认为多次调用ruby_init()
可能会导致ruby跟踪的堆栈位置出现问题,并破坏GC。重新启动整个应用程序不是一个选项,因为它有一个GUI界面。另外,将所有ruby内容放在一个单独的过程中会很痛苦,因为在应用程序上插入新GUI元素的Qt接口是公开的。另一种选择是以某种方式跟踪所有定义的方法、类、常量等,并在重新执行代码之前取消它们的定义。有简单的方法吗?
是的,有!(我认为)(这需要使用一些Ruby代码来加载其他Ruby代码):
$current_env = nil
def reload(code)
$current_env = Module.new
$current_env.module_eval(code)
end
是的,就这么简单。每当你需要从插件中访问东西时,只需将$current_env作为一个模块访问即可:
$current_env::ExtensionClass.extension_thing
调用reload
时被替换的旧类变得不可访问,而且在GC下次调用时会被释放。
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- std::future_error:无关联状态
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 试图在崇高中奔跑. 错误 已发生: 收集2.exe: 错误: ld 返回 1 退出状态
- 在容器上移动分配:以前包含的对象的状态
- 文件格式的编写解释器(C++ Arduino)
- collect2:错误:ld 返回 1 个退出状态未定义的引用
- 具有动态大小的特征矩阵的默认初始状态
- 重置嵌入式ruby解释器的状态