在Ruby的当前版本中挖掘cont.c
的代码时,我对此感到疑惑。 setjmp
的文档说明在返回longjmp
的调用者之后,在jmp_buf结构上调用setjmp
是一个错误。但是,看起来Ruby很快乐地做到了并且没有崩溃:
https://github.com/ruby/ruby/blob/05f087c844f0e1e7cfe323edcf591de64069a289/cont.c#L522 https://github.com/ruby/ruby/blob/05f087c844f0e1e7cfe323edcf591de64069a289/cont.c#L775 (+多用纤维)
我问:这怎么可能?
我确实注意到相同的源代码也使用了set/getcontext
,但只有光纤或者看起来如此。使用这些函数而不是set/longjmp
对我来说似乎更合理。