|  | // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | #include "vm/longjump.h" | 
|  |  | 
|  | #include "include/dart_api.h" | 
|  |  | 
|  | #include "vm/dart_api_impl.h" | 
|  | #include "vm/isolate.h" | 
|  | #include "vm/object.h" | 
|  | #include "vm/os.h" | 
|  |  | 
|  | namespace dart { | 
|  |  | 
|  | jmp_buf* LongJumpScope::Set() { | 
|  | ASSERT(top_ == NULL); | 
|  | top_ = Thread::Current()->top_resource(); | 
|  | return &environment_; | 
|  | } | 
|  |  | 
|  | void LongJumpScope::Jump(int value, const Error& error) { | 
|  | // A zero is the default return value from setting up a LongJumpScope | 
|  | // using Set. | 
|  | ASSERT(value != 0); | 
|  | ASSERT(!error.IsNull()); | 
|  |  | 
|  | Thread* thread = Thread::Current(); | 
|  | DEBUG_ASSERT(thread->TopErrorHandlerIsSetJump()); | 
|  |  | 
|  | #if defined(DEBUG) | 
|  | #define CHECK_REUSABLE_HANDLE(name)                                            \ | 
|  | ASSERT(!thread->reusable_##name##_handle_scope_active()); | 
|  | REUSABLE_HANDLE_LIST(CHECK_REUSABLE_HANDLE) | 
|  | #undef CHECK_REUSABLE_HANDLE | 
|  | #endif  // defined(DEBUG) | 
|  |  | 
|  | // Remember the error in the sticky error of this isolate. | 
|  | thread->set_sticky_error(error); | 
|  |  | 
|  | // Destruct all the active StackResource objects. | 
|  | StackResource::UnwindAbove(thread, top_); | 
|  | longjmp(environment_, value); | 
|  | UNREACHABLE(); | 
|  | } | 
|  |  | 
|  | }  // namespace dart |