// 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/object_store.h"
#include "vm/os.h"
#include "vm/simulator.h"

namespace dart {

jmp_buf* LongJumpScope::Set() {
  ASSERT(top_ == NULL);
  top_ = Thread::Current()->top_resource();
  return &environment_;
}

bool LongJumpScope::IsSafeToJump() {
  // We do not want to jump past Dart frames.  Note that this code
  // assumes the stack grows from high to low.
  Thread* thread = Thread::Current();
  uword jumpbuf_addr = OSThread::GetCurrentStackPointer();
#if defined(USING_SIMULATOR)
  Simulator* sim = Simulator::Current();
  // When using simulator, only mutator thread should refer to Simulator
  // since there can be only one per isolate.
  uword top_exit_frame_info =
      thread->IsMutatorThread() ? sim->top_exit_frame_info() : 0;
#else
  uword top_exit_frame_info = thread->top_exit_frame_info();
#endif
  if (!thread->IsMutatorThread()) {
    // A helper thread does not execute Dart code, so it's safe to jump.
    ASSERT(top_exit_frame_info == 0);
    return true;
  }
  return ((top_exit_frame_info == 0) || (jumpbuf_addr < top_exit_frame_info));
}

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(IsSafeToJump());

  Thread* thread = Thread::Current();

#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
