// Copyright 2016 Google Inc. 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_WEAK_HEAP_OBJECT_H_
#define COBALT_SCRIPT_MOZJS_45_WEAK_HEAP_OBJECT_H_

#include "cobalt/script/mozjs-45/weak_heap_object_manager.h"
#include "third_party/mozjs-45/js/src/jsapi.h"

namespace cobalt {
namespace script {
namespace mozjs {

// This class implements a weak reference to a JS::Value. The JS::Value that an
// instance of this class is created with may get garbage collected. In that
// case, subsequent calls to WeakHeapObject::Get() will return a NULL pointer.
class WeakHeapObject {
 public:
  WeakHeapObject(JSContext* context, JS::HandleValue value);
  WeakHeapObject(JSContext* context, JS::HandleObject object);
  WeakHeapObject(const WeakHeapObject& other);

  WeakHeapObject& operator=(const WeakHeapObject& rhs);
  const JS::Value& GetValue() const { return value_.get(); }
  JSObject* GetObject() const {
    return value_.toObjectOrNull();
  }

  void Trace(JSTracer* trace);
  bool IsObject() const;
  bool IsGcThing() const;

  // Whether the value was a GC Thing and has been actually GC'd.
  bool WasCollected() const;

  ~WeakHeapObject();

 private:
  void Initialize(WeakHeapObjectManager* weak_heap_object_manager,
                  const JS::Value& value);

  bool IsNull() const;
  void UpdateWeakPointerAfterGc();

  WeakHeapObjectManager* weak_object_manager_;
  JS::Heap<JS::Value> value_;
  bool was_collected_;

  friend class WeakHeapObjectManager;
};

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

#endif  // COBALT_SCRIPT_MOZJS_45_WEAK_HEAP_OBJECT_H_
