js/public/WeakMapPtr.h
author Gregory Szorc <gps@mozilla.com>
Wed, 14 Jun 2017 16:52:55 -0700
changeset 364238 398d9d49677547b1b9f106370858c925de8c1511
parent 273033 a621c6d49da11548244ba40ba131db239195c43c
child 385759 39d2b1b24e0ff48a828c89d6106ba18c0be745a8
permissions -rw-r--r--
Bug 1371465 - Move MSVS_VERSION to moz.configure and properly define for vs2017; r=glandium Before, MSVS was set in old-configure and could only be unset or "2015." We move the definition of the variable to moz.configure and support defining its value as "2017" when VS2017 is being used. As part of this, I discovered that GYP barfs with a "2017" value. This is likely a limitation of the legacy version of GYP we have vendored. Rather than go down the rabbit hole of upgrading GYP, I added code to convert the value to "2015." This preserves existing behavior and unblocks us from setting MSVS_VERSION properly. A warning is emitted to remind us to remove this hack once GYP is upgraded. After this commit, we now generate native VS2017 solutions and projects when building with VS2017. MozReview-Commit-ID: BvNJX3F8qCn

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 * vim: set ts=8 sts=4 et sw=4 tw=99:
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef js_WeakMapPtr_h
#define js_WeakMapPtr_h

#include "jspubtd.h"

#include "js/TypeDecls.h"

namespace JS {

// A wrapper around the internal C++ representation of SpiderMonkey WeakMaps,
// usable outside the engine.
//
// The supported template specializations are enumerated in WeakMapPtr.cpp. If
// you want to use this class for a different key/value combination, add it to
// the list and the compiler will generate the relevant machinery.
template <typename K, typename V>
class JS_PUBLIC_API(WeakMapPtr)
{
  public:
    WeakMapPtr() : ptr(nullptr) {}
    bool init(JSContext* cx);
    bool initialized() { return ptr != nullptr; }
    void destroy();
    virtual ~WeakMapPtr() { MOZ_ASSERT(!initialized()); }
    void trace(JSTracer* tracer);

    V lookup(const K& key);
    bool put(JSContext* cx, const K& key, const V& value);

  private:
    void* ptr;

    // WeakMapPtr is neither copyable nor assignable.
    WeakMapPtr(const WeakMapPtr& wmp) = delete;
    WeakMapPtr& operator=(const WeakMapPtr& wmp) = delete;
};

} /* namespace JS */

#endif  /* js_WeakMapPtr_h */