// 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_WEAK_HEAP_OBJECT_H_
#define COBALT_SCRIPT_MOZJS_WEAK_HEAP_OBJECT_H_

#include "cobalt/script/mozjs/weak_heap_object_manager.h"
#include "third_party/mozjs/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;

  // Whether the value is a GC Thing and not null or undefined.
  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_WEAK_HEAP_OBJECT_H_
