author Boris Zbarsky <>
Mon, 05 Nov 2012 10:20:04 -0500
changeset 112308 0b9b3b2b89712b7f256dd76c5b55719a15dc0dd8
parent 109885 176600f40ddfc4d73e2367285eca456eda33ed62
child 169893 babff8d1437ba51b159ed5e08333485f56d1aca8
permissions -rw-r--r--
Bug 807222 part 3. Make sure we enter the right compartment before we try to define interface constants on a constructor. r=bholley

/* 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 */

#include "mozilla/WeakPtr.h"

using mozilla::SupportsWeakPtr;
using mozilla::WeakPtr;

// To have a class C support weak pointers, inherit from SupportsWeakPtr<C>.
class C : public SupportsWeakPtr<C>
    int num;
    void act() {}

static void

  C* ptr =  new C();

  // Get weak pointers to ptr. The first time asWeakPtr is called
  // a reference counted WeakReference object is created that
  // can live beyond the lifetime of 'ptr'. The WeakReference
  // object will be notified of 'ptr's destruction.
  WeakPtr<C> weak = ptr->asWeakPtr();
  WeakPtr<C> other = ptr->asWeakPtr();

  // Test a weak pointer for validity before using it.
  if (weak) {
    weak->num = 17;

  // Destroying the underlying object clears weak pointers to it.
  delete ptr;

  MOZ_ASSERT(!weak, "Deleting |ptr| clears weak pointers to it.");
  MOZ_ASSERT(!other, "Deleting |ptr| clears all weak pointers to it.");

struct A : public SupportsWeakPtr<A>
    int data;


  A* a = new A;

  // a2 is unused to test the case when we haven't initialized
  // the internal WeakReference pointer.
  A* a2 = new A;

  a->data = 5;
  WeakPtr<A> ptr = a->asWeakPtr();
      WeakPtr<A> ptr2 = a->asWeakPtr();
      MOZ_ASSERT(ptr->data == 5);
      WeakPtr<A> ptr3 = a->asWeakPtr();
      MOZ_ASSERT(ptr->data == 5);

  delete a;

  delete a2;


  return 0;