| Index: dart/runtime/vm/compiler.cc
 | 
| ===================================================================
 | 
| --- dart/runtime/vm/compiler.cc	(revision 31530)
 | 
| +++ dart/runtime/vm/compiler.cc	(working copy)
 | 
| @@ -74,9 +74,7 @@
 | 
|  RawError* Compiler::Compile(const Library& library, const Script& script) {
 | 
|    Isolate* isolate = Isolate::Current();
 | 
|    StackZone zone(isolate);
 | 
| -  LongJump* base = isolate->long_jump_base();
 | 
| -  LongJump jump;
 | 
| -  isolate->set_long_jump_base(&jump);
 | 
| +  LongJumpScope jump;
 | 
|    if (setjmp(*jump.Set()) == 0) {
 | 
|      if (FLAG_trace_compiler) {
 | 
|        const String& script_url = String::Handle(script.url());
 | 
| @@ -86,13 +84,11 @@
 | 
|      const String& library_key = String::Handle(library.private_key());
 | 
|      script.Tokenize(library_key);
 | 
|      Parser::ParseCompilationUnit(library, script);
 | 
| -    isolate->set_long_jump_base(base);
 | 
|      return Error::null();
 | 
|    } else {
 | 
|      Error& error = Error::Handle();
 | 
|      error = isolate->object_store()->sticky_error();
 | 
|      isolate->object_store()->clear_sticky_error();
 | 
| -    isolate->set_long_jump_base(base);
 | 
|      return error.raw();
 | 
|    }
 | 
|    UNREACHABLE();
 | 
| @@ -168,9 +164,7 @@
 | 
|  
 | 
|    // Parse the class and all the interfaces it implements and super classes.
 | 
|    StackZone zone(isolate);
 | 
| -  LongJump* base = isolate->long_jump_base();
 | 
| -  LongJump jump;
 | 
| -  isolate->set_long_jump_base(&jump);
 | 
| +  LongJumpScope jump;
 | 
|    if (setjmp(*jump.Set()) == 0) {
 | 
|      if (FLAG_trace_compiler) {
 | 
|        OS::Print("Compiling Class %s '%s'\n", "", cls.ToCString());
 | 
| @@ -215,7 +209,6 @@
 | 
|        parse_class.reset_is_marked_for_parsing();
 | 
|      }
 | 
|  
 | 
| -    isolate->set_long_jump_base(base);
 | 
|      return Error::null();
 | 
|    } else {
 | 
|      // Reset the marked for parsing flags.
 | 
| @@ -235,7 +228,6 @@
 | 
|      Error& error = Error::Handle();
 | 
|      error = isolate->object_store()->sticky_error();
 | 
|      isolate->object_store()->clear_sticky_error();
 | 
| -    isolate->set_long_jump_base(base);
 | 
|      return error.raw();
 | 
|    }
 | 
|    UNREACHABLE();
 | 
| @@ -283,10 +275,8 @@
 | 
|    while (!done) {
 | 
|      const intptr_t prev_deopt_id = isolate->deopt_id();
 | 
|      isolate->set_deopt_id(0);
 | 
| -    LongJump* old_base = isolate->long_jump_base();
 | 
| -    LongJump bailout_jump;
 | 
| -    isolate->set_long_jump_base(&bailout_jump);
 | 
| -    if (setjmp(*bailout_jump.Set()) == 0) {
 | 
| +    LongJumpScope jump;
 | 
| +    if (setjmp(*jump.Set()) == 0) {
 | 
|        FlowGraph* flow_graph = NULL;
 | 
|        // TimerScope needs an isolate to be properly terminated in case of a
 | 
|        // LongJump.
 | 
| @@ -608,7 +598,6 @@
 | 
|        is_compiled = false;
 | 
|      }
 | 
|      // Reset global isolate state.
 | 
| -    isolate->set_long_jump_base(old_base);
 | 
|      isolate->set_deopt_id(prev_deopt_id);
 | 
|    }
 | 
|    return is_compiled;
 | 
| @@ -745,15 +734,12 @@
 | 
|                                         intptr_t osr_id) {
 | 
|    Isolate* isolate = Isolate::Current();
 | 
|    StackZone zone(isolate);
 | 
| -  LongJump* base = isolate->long_jump_base();
 | 
| -  LongJump jump;
 | 
| -  isolate->set_long_jump_base(&jump);
 | 
| +  LongJumpScope jump;
 | 
|    // Make sure unoptimized code is not collected while we are compiling.
 | 
|    const Code& unoptimized_code = Code::ZoneHandle(function.unoptimized_code());
 | 
|    // Skips parsing if we need to only install unoptimized code.
 | 
|    if (!optimized && !unoptimized_code.IsNull()) {
 | 
|      InstallUnoptimizedCode(function);
 | 
| -    isolate->set_long_jump_base(base);
 | 
|      return Error::null();
 | 
|    }
 | 
|    if (setjmp(*jump.Set()) == 0) {
 | 
| @@ -787,7 +773,6 @@
 | 
|          OS::Print("Cannot optimize: %s\n", function.ToFullyQualifiedCString());
 | 
|        }
 | 
|        function.SetIsOptimizable(false);
 | 
| -      isolate->set_long_jump_base(base);
 | 
|        return Error::null();
 | 
|      }
 | 
|  
 | 
| @@ -813,14 +798,12 @@
 | 
|        OS::Print("*** END CODE\n");
 | 
|      }
 | 
|  
 | 
| -    isolate->set_long_jump_base(base);
 | 
|      return Error::null();
 | 
|    } else {
 | 
|      Error& error = Error::Handle();
 | 
|      // We got an error during compilation.
 | 
|      error = isolate->object_store()->sticky_error();
 | 
|      isolate->object_store()->clear_sticky_error();
 | 
| -    isolate->set_long_jump_base(base);
 | 
|      return error.raw();
 | 
|    }
 | 
|    UNREACHABLE();
 | 
| @@ -842,23 +825,19 @@
 | 
|  RawError* Compiler::CompileParsedFunction(
 | 
|      ParsedFunction* parsed_function) {
 | 
|    Isolate* isolate = Isolate::Current();
 | 
| -  LongJump* base = isolate->long_jump_base();
 | 
| -  LongJump jump;
 | 
| -  isolate->set_long_jump_base(&jump);
 | 
| +  LongJumpScope jump;
 | 
|    if (setjmp(*jump.Set()) == 0) {
 | 
|      // Non-optimized code generator.
 | 
|      CompileParsedFunctionHelper(parsed_function, false, Isolate::kNoDeoptId);
 | 
|      if (FLAG_disassemble) {
 | 
|        DisassembleCode(parsed_function->function(), false);
 | 
|      }
 | 
| -    isolate->set_long_jump_base(base);
 | 
|      return Error::null();
 | 
|    } else {
 | 
|      Error& error = Error::Handle();
 | 
|      // We got an error during compilation.
 | 
|      error = isolate->object_store()->sticky_error();
 | 
|      isolate->object_store()->clear_sticky_error();
 | 
| -    isolate->set_long_jump_base(base);
 | 
|      return error.raw();
 | 
|    }
 | 
|    UNREACHABLE();
 | 
| @@ -911,9 +890,7 @@
 | 
|  
 | 
|  RawObject* Compiler::ExecuteOnce(SequenceNode* fragment) {
 | 
|    Isolate* isolate = Isolate::Current();
 | 
| -  LongJump* base = isolate->long_jump_base();
 | 
| -  LongJump jump;
 | 
| -  isolate->set_long_jump_base(&jump);
 | 
| +  LongJumpScope jump;
 | 
|    if (setjmp(*jump.Set()) == 0) {
 | 
|      if (FLAG_trace_compiler) {
 | 
|        OS::Print("compiling expression: ");
 | 
| @@ -956,13 +933,11 @@
 | 
|  
 | 
|      const Object& result = Object::Handle(
 | 
|          DartEntry::InvokeFunction(func, Object::empty_array()));
 | 
| -    isolate->set_long_jump_base(base);
 | 
|      return result.raw();
 | 
|    } else {
 | 
|      const Object& result =
 | 
|        Object::Handle(isolate->object_store()->sticky_error());
 | 
|      isolate->object_store()->clear_sticky_error();
 | 
| -    isolate->set_long_jump_base(base);
 | 
|      return result.raw();
 | 
|    }
 | 
|    UNREACHABLE();
 | 
| 
 |