// 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_REFERENCED_OBJECT_MAP_H_
#define COBALT_SCRIPT_MOZJS_45_REFERENCED_OBJECT_MAP_H_

#include "base/containers/hash_tables.h"
#include "base/threading/thread_checker.h"
#include "cobalt/script/mozjs-45/weak_heap_object.h"
#include "cobalt/script/wrappable.h"
#include "third_party/mozjs-45/js/src/jsapi.h"

namespace cobalt {
namespace script {
namespace mozjs {

// Maintains a set of |JSObject|s that are reachable from a given object. This
// relationship is registered by mapping a |Wrappable| to a |JSObject|. During
// garbage collection, supply a |Wrappable| to |TraceReferencedObjects| to
// trace all objects that are registered as being reachable from the object.
class ReferencedObjectMap {
 public:
  explicit ReferencedObjectMap(JSContext* context);
  ~ReferencedObjectMap();

  void AddReferencedObject(Wrappable* wrappable, JS::HandleValue referee);
  void RemoveReferencedObject(Wrappable* wrappable, JS::HandleValue referee);

  // Trace all objects referenced from this |wrappable|.
  void TraceReferencedObjects(JSTracer* trace, Wrappable* wrappable);

  // Remove any referenced objects that are NULL. It may be the case that a
  // weak reference to an object was garbage collected, so remove it from the
  // internal list.
  void RemoveNullReferences();

 private:
  typedef base::hash_multimap<const Wrappable*, WeakHeapObject>
      ReferencedObjectMultiMap;

  THREAD_CHECKER(thread_checker_);
  JSContext* const context_;
  ReferencedObjectMultiMap referenced_objects_;
};

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

#endif  // COBALT_SCRIPT_MOZJS_45_REFERENCED_OBJECT_MAP_H_
