// 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"

namespace dart {

jmp_buf* LongJump::Set() {
  top_ = Isolate::Current()->top_resource();
  return &environment_;
}


bool LongJump::IsSafeToJump() {
  // We do not want to jump past Dart frames.  Note that this code
  // assumes the stack grows from high to low.
  Isolate* isolate = Isolate::Current();
  uword jumpbuf_addr = reinterpret_cast<uword>(this);
  return (isolate->top_exit_frame_info() == 0 ||
          jumpbuf_addr < isolate->top_exit_frame_info());
}


void LongJump::Jump(int value, const Error& error) {
  // A zero is the default return value from setting up a LongJump using Set.
  ASSERT(value != 0);
  ASSERT(IsSafeToJump());

  Isolate* isolate = Isolate::Current();

  // Remember the error in the sticky error of this isolate.
  isolate->object_store()->set_sticky_error(error);

  // Destruct all the active StackResource objects.
  StackResource* current_resource = isolate->top_resource();
  while (current_resource != top_) {
    current_resource->~StackResource();
    current_resource = isolate->top_resource();
  }
  longjmp(environment_, value);
  UNREACHABLE();
}

}  // namespace dart
