| ▲ | Joker_vD 4 hours ago | ||||||||||||||||
Hmm. I'm fairly certain that most of that assembly code for saving/restoring registers can be replaced with setjmp/longjmp, and only control transfer itself would require actual assembly. But maybe not. That's the problem with register machines, I guess. Interestingly enough, BCPL, its main implementation being a p-code interpreter of sorts, has pretty trivially supported coroutines in its "standard" library since the late seventies — as you say, all you need to save is the current stack pointer and the code pointer. | |||||||||||||||||
| ▲ | zabzonk 4 hours ago | parent | next [-] | ||||||||||||||||
You can do a lot of horrible things with setjmp and friends. I actually implemented some exception throw/catch macros using them (which did work) for a compiler that didn't support real C++ exceptions. Thank god we never used them in production code. This would be about 32 years ago - I don't like thinking about that ... | |||||||||||||||||
| ▲ | lelanthran 4 hours ago | parent | prev | next [-] | ||||||||||||||||
> Hmm. I'm fairly certain that most of that assembly code for saving/restoring registers can be replaced with setjmp/longjmp, and only control transfer itself would require actual assembly. Actually you don't even need setjmp/longjmp. I've used a library (embedded environment) called protothreads (plain C) that abused the preprocessor to implement stackful coroutines. (Defined a macro that used the __LINE__ macro coupled with another macro that used a switch statement to ensure that calling the function again made it resume from where the last YIELD macro was encountered) | |||||||||||||||||
| |||||||||||||||||
| ▲ | gpderetta 4 hours ago | parent | prev [-] | ||||||||||||||||
setjmp + longjump + sigaltstack is indeed the old trick. | |||||||||||||||||