// Copyright 2019 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "starboard/thread.h"

#if SB_API_VERSION >= 11

#include <ucontext.h>

#include "starboard/common/log.h"
#include "starboard/shared/pthread/thread_context_internal.h"

bool SbThreadContextGetPointer(SbThreadContext context,
                               SbThreadContextProperty property,
                               void** out_value) {
  if (context == kSbThreadContextInvalid || context->ip_ == nullptr) {
    return false;
  }

  switch (property) {
    case kSbThreadContextInstructionPointer:
      *out_value = context->ip_;
      return true;

    case kSbThreadContextStackPointer:
      *out_value = context->sp_;
      return true;

    case kSbThreadContextFramePointer:
      *out_value = context->fp_;
      return true;

    default:
      SB_NOTIMPLEMENTED() << "SbThreadContextGetPointer not implemented for "
                          << property;
      return false;
  }
}

#endif  // SB_API_VERSION >= 11
