1/** 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 4 * Copyright (C) 2003, 2004, 2005, 2006, 2010 Apple Inc. All rights reserved. 5 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) 6 * 7 * This library is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Library General Public 9 * License as published by the Free Software Foundation; either 10 * version 2 of the License, or (at your option) any later version. 11 * 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Library General Public License for more details. 16 * 17 * You should have received a copy of the GNU Library General Public License 18 * along with this library; see the file COPYING.LIB. If not, write to 19 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 20 * Boston, MA 02110-1301, USA. 21 * 22 */ 23 24#include "config.h" 25#include "BidiRun.h" 26#include "InlineBox.h" 27#include "RenderArena.h" 28#include <wtf/RefCountedLeakCounter.h> 29#include <wtf/StdLibExtras.h> 30 31using namespace WTF; 32 33namespace WebCore { 34 35DEFINE_DEBUG_ONLY_GLOBAL(RefCountedLeakCounter, bidiRunCounter, ("BidiRun")); 36 37#ifndef NDEBUG 38static bool inBidiRunDestroy; 39#endif 40 41void BidiRun::destroy() 42{ 43#ifndef NDEBUG 44 inBidiRunDestroy = true; 45#endif 46 RenderArena* renderArena = m_object->renderArena(); 47 delete this; 48#ifndef NDEBUG 49 inBidiRunDestroy = false; 50#endif 51 52 // Recover the size left there for us by operator delete and free the memory. 53 renderArena->free(*reinterpret_cast<size_t*>(this), this); 54} 55 56void* BidiRun::operator new(size_t sz, RenderArena* renderArena) 57{ 58#ifndef NDEBUG 59 bidiRunCounter.increment(); 60#endif 61 return renderArena->allocate(sz); 62} 63 64void BidiRun::operator delete(void* ptr, size_t sz) 65{ 66#ifndef NDEBUG 67 bidiRunCounter.decrement(); 68#endif 69 ASSERT(inBidiRunDestroy); 70 71 // Stash size where destroy() can find it. 72 *(size_t*)ptr = sz; 73} 74 75} 76