BidiRun.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. #include "config.h"
  24. #include "BidiRun.h"
  25. #include "InlineBox.h"
  26. #include "RenderArena.h"
  27. #include <wtf/RefCountedLeakCounter.h>
  28. #include <wtf/StdLibExtras.h>
  29. using namespace WTF;
  30. namespace WebCore {
  31. DEFINE_DEBUG_ONLY_GLOBAL(RefCountedLeakCounter, bidiRunCounter, ("BidiRun"));
  32. #ifndef NDEBUG
  33. static bool inBidiRunDestroy;
  34. #endif
  35. void BidiRun::destroy()
  36. {
  37. #ifndef NDEBUG
  38. inBidiRunDestroy = true;
  39. #endif
  40. RenderArena* renderArena = m_object->renderArena();
  41. delete this;
  42. #ifndef NDEBUG
  43. inBidiRunDestroy = false;
  44. #endif
  45. // Recover the size left there for us by operator delete and free the memory.
  46. renderArena->free(*reinterpret_cast<size_t*>(this), this);
  47. }
  48. void* BidiRun::operator new(size_t sz, RenderArena* renderArena)
  49. {
  50. #ifndef NDEBUG
  51. bidiRunCounter.increment();
  52. #endif
  53. return renderArena->allocate(sz);
  54. }
  55. void BidiRun::operator delete(void* ptr, size_t sz)
  56. {
  57. #ifndef NDEBUG
  58. bidiRunCounter.decrement();
  59. #endif
  60. ASSERT(inBidiRunDestroy);
  61. // Stash size where destroy() can find it.
  62. *(size_t*)ptr = sz;
  63. }
  64. }