Long jumps considered way more harmful than exceptions

Bob
Congdon’s blog (http://www.bobcongdon.net/blog/)
points out that in the dark days before exception handling you could always use setjmp/longjmp “urn:schemas-microsoft-com:office:office” /> to
do non-local gotos.

 

In
fact, the script engines are compiled in C++ with exception handling turned off (for
performance reasons), and the mainline loop of the bytecode interpreter uses setjmp-longjmp exception
handling to implement error handling.  When
you have a script that calls an object that returns an error, we longjmp back to the
start of the interpreter loop and then figure out what to do next.

 

In
VBScript of course it depends on whether On
Error Resume Next is
on or not, and in JScript we construct an exception object and start propagating it
back up the stack until we find an interpreter frame that has a catch block.  (If
there are multiple script engines on the stack then things get extremely complicated,
so I won’t even go there.)

 

Since
a long jump does not call any destructors, it was very important that we design our
interpreter loop to not put anything on the system stack that required destructing.  Fortunately,
since we were designing the interpreter to be an interpreter for a garbage-collected
language, it was pretty easy.  Everything
that the interpreter does that requires memory either takes the memory out of the
area reserved for the script’s stack (which will be cleaned up when the frame goes
away) or heap-allocates it and adds the memory to the garbage collector.

 

Not
everyone has the luxury of having a longjmp-safe
garbage collector already implemented, so kids, don’t try this at home!  If
you must use exception handling in C++, take my advice and use real C++ exception
handling.

Tags COM Programming Performance Scripting

Comments (4)

You must be logged in to post a comment.

  1. MMWhat was the measured cost when C++ exceptions were turned on?
  2. Log in to Reply
  3. October 17, 2003 at 12:35 am
  4. RJ”In fact, the script engines are compiled in C++ with exception handling turned off (for performance reasons)”Log in to Reply
  5. It would be interesting to know *which* performance reasons these were after your reply to my comment in “I take exception to that” – sorry for being facetious 8*)
  6. October 17, 2003 at 4:30 am
  7. Eric Lippert> What was the measured cost when C++ exceptions were turned on?> It would be interesting to know *which* performance reasons these wereLog in to Reply
  8. The overall cost, not the per-exception cost, killed our performance on the server. Exception handling adds additional code to every function, and that additional code has a nonzero run time. Since the purpose of the code — handling exceptions — was NEVER going to be fulfilled becasue we never THREW an exception, we turned it off.
  9. You’re asking me for the numbers which we measured on Pentium 1’s seven years ago? I haven’t got them on me, sorry. But it was significant.
  10. October 17, 2003 at 11:29 am
  11. RJSorry if it appears I am being awkward, I’m not – I’m just interested in learning to be optimal 🙂
  12. Log in to Reply
  13. October 17, 2003 at 1:12 pm

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s