C 在Ruby的延续中设置jmp/longjmp

C 在Ruby的延续中设置jmp/longjmp,c,ruby,continuations,setjmp,C,Ruby,Continuations,Setjmp,当我在Ruby当前版本中挖掘cont.c的代码时,我想知道这一点。setjmp的文档表明,在setjmp的调用者返回后在jmp_buf结构上调用longjmp是一个错误。但是,Ruby似乎很高兴地做到了这一点,并且没有崩溃: +纤维的更多用途 我问:这怎么可能 我确实注意到,相同的源代码也使用set/getcontext,但似乎只使用了光纤。在我看来,使用这些函数比使用set/longjmp更合理 未定义的行为,但它通常按预期工作。抱歉,这些示例调用的是ruby_setjmp,而不是setjm

当我在Ruby当前版本中挖掘cont.c的代码时,我想知道这一点。setjmp的文档表明,在setjmp的调用者返回后在jmp_buf结构上调用longjmp是一个错误。但是,Ruby似乎很高兴地做到了这一点,并且没有崩溃:

+纤维的更多用途

我问:这怎么可能


我确实注意到,相同的源代码也使用set/getcontext,但似乎只使用了光纤。在我看来,使用这些函数比使用set/longjmp更合理

未定义的行为,但它通常按预期工作。抱歉,这些示例调用的是ruby_setjmp,而不是setjmp。前者是后者的包袱吗?如果是这样的话,它是否有可能使用仪器来完成这项工作,例如创建一个重复的堆栈帧,或者执行一些其他的魔术来允许相应的ruby_longjmp工作?@cremno好的,我希望这样。但老实说,这并不太令人放心。@JohnBollinger它基本上是一个别名:定义ruby_setjmpenv ruby_setjmpenv定义ruby_setjmpenv_setjmpenv几乎和ruby_longjmp一样。这并不是那么简单,因为CRuby可以使用u内置的setjmp、_setjmp、sigsetjmp、setjmp或setjmpex作为ruby_setjmp。可能所有这些变化也没有定义这一点。实际上,如果您查看“ruby_longjmp”调用上方,似乎有一些与堆栈上下文相关的代码。