// Copyright 2016 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.

#ifndef COBALT_SCRIPT_MOZJS_45_MOZJS_EXCEPTION_STATE_H_
#define COBALT_SCRIPT_MOZJS_45_MOZJS_EXCEPTION_STATE_H_

#include <string>

#include "base/threading/thread_checker.h"
#include "cobalt/script/exception_state.h"
#include "third_party/mozjs-45/js/src/jsapi.h"

namespace cobalt {
namespace script {
namespace mozjs {

class MozjsExceptionState : public ExceptionState {
 public:
  explicit MozjsExceptionState(JSContext* context)
      : is_exception_set_(false), context_(context) {}
  // ExceptionState interface
  void SetException(const scoped_refptr<ScriptException>& exception) override;
  void SetSimpleExceptionVA(SimpleExceptionType type, const char* format,
                            va_list & arguments) override;

  bool is_exception_set() const { return is_exception_set_; }

  // For when a Cobalt operation that is expected to modify an
  // |ExceptionState| to communicate failure performs operations that can
  // potentially cause an exception to be thrown by SpiderMonkey, and we want
  // to reuse that exception instead of creating our own (which also likely
  // would not be able to match the descriptiveness of the SpiderMonkey
  // exception).
  void SetExceptionAlreadySet(JSContext* context) {
    DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
    DCHECK(!is_exception_set_);
    DCHECK(JS_IsExceptionPending(context));
    is_exception_set_ = true;
  }

  static JSObject* CreateErrorObject(JSContext* context,
                                     SimpleExceptionType type);

 private:
  bool is_exception_set_;
  JSContext* context_;
  THREAD_CHECKER(thread_checker_);
};

}  // namespace mozjs
}  // namespace script
}  // namespace cobalt

#endif  // COBALT_SCRIPT_MOZJS_45_MOZJS_EXCEPTION_STATE_H_
