News for hackers. Stuff that matters.
Re:Let's write a setjmp by aardvark179 on Sunday February 12, 2023 @06:35AM (#34762045)
As well as being harder to work with correctly setjmp and longjmp are often a lot slower than other exception handling systems as you are paying the full cost of saving lots of register state even if an exception isn’t thrown. I’ve seen this cause serious performance issues on Windows on x86-64 in the past.

It also doesn’t really compose well, so if library A is using it for exceptions and library B is doing something else clever then it’s hard to coordinate those two uses.

Re:Let's write a setjmp by yvdriess on Sunday February 12, 2023 @06:56AM (#34762169)
Can you elaborate? Isn't the c++ exception system built on top of setjmp/longjmp?

For setjmp to have a measurable performance impact, you have to be calling it an awful lot. It is just a handful of mov instructions without dependencies.

Re:Let's write a setjmp by bregma on Sunday February 12, 2023 @07:12AM (#34762259)
None of the popular C++ vendors implement C++ exceptions using setjmp/longjmp on any of the more (and very few of the less) common targets. Maintaining C++ language runtimes is a part of my day job and I am thankful they don't.
Re:Let's write a setjmp by aardvark179 on Sunday February 12, 2023 @08:20AM (#34762617)
Depending on the ABI it’s saving a lot of registers, and it is very easy to end up calling it a lot if you cannot guarantee the code that may be called by functions you call and you need to do any cleanup.

C++ and other languages tend to make the fast path of no exception extremely fast and store additional data about functions that allow for stack unwinding when an exception is thrown.

Re:Let's write a setjmp by jcranmer on Sunday February 12, 2023 @10:11AM (#34763374)
> Isn't the c++ exception system built on top of setjmp/longjmp?

It is not. The dominant C++ exception system is based on "zero-cost exception handling", which refers to the fact that you do not call any extra code (like setjmp) until an exception is to be thrown. All of that logic is instead encapsulated in tables of exception-handling data and sophisticated unwind routines that look up those tables to figure out where to transfer control-flow to.

> For setjmp to have a measurable performance impact, you have to be calling it an awful lot.

If you built the C++ exception system on top of setjmp/longjmp, you would have to call setjmp on every instance that begins a try block. This includes implicit try blocks generated for every object that has a nontrivial destructor (which must be called if you unwind through the block). So yeah, you would be calling it an awful lot...

Re:Let's write a setjmp by yvdriess on Monday February 13, 2023 @03:36AM (#34771391)
Right, I should have known, libunwind is a basic requirement for supporting a C++ runtime on a target.
Re:Let's write a setjmp by account42 on Monday February 13, 2023 @07:22AM (#34772644)
There are C++ exception implementation's based on setjmp/longjmp though, e.g. MinGW's sjlj configuration.