JSWeakValue.h 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*
  2. * Copyright (C) 2013, 2016 Apple Inc. All rights reserved.
  3. * Copyright (C) 2018 Igalia S.L.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions
  7. * are met:
  8. * 1. Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. * 2. Redistributions in binary form must reproduce the above copyright
  11. * notice, this list of conditions and the following disclaimer in the
  12. * documentation and/or other materials provided with the distribution.
  13. *
  14. * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
  15. * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  16. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  17. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
  18. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  19. * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  20. * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  21. * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  22. * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  23. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  24. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25. */
  26. #pragma once
  27. #include "JSCJSValue.h"
  28. #include "Weak.h"
  29. namespace JSC {
  30. class JSObject;
  31. class JSString;
  32. class WeakHandleOwner;
  33. class JSWeakValue {
  34. public:
  35. JSWeakValue() = default;
  36. ~JSWeakValue();
  37. void clear();
  38. bool isClear() const;
  39. bool isSet() const { return m_tag != WeakTypeTag::NotSet; }
  40. bool isPrimitive() const { return m_tag == WeakTypeTag::Primitive; }
  41. bool isObject() const { return m_tag == WeakTypeTag::Object; }
  42. bool isString() const { return m_tag == WeakTypeTag::String; }
  43. void setPrimitive(JSValue);
  44. void setObject(JSObject*, WeakHandleOwner&, void* context);
  45. void setString(JSString*, WeakHandleOwner&, void* context);
  46. JSObject* object() const
  47. {
  48. ASSERT(isObject());
  49. return m_value.object.get();
  50. }
  51. JSValue primitive() const
  52. {
  53. ASSERT(isPrimitive());
  54. return m_value.primitive;
  55. }
  56. JSString* string() const
  57. {
  58. ASSERT(isString());
  59. return m_value.string.get();
  60. }
  61. private:
  62. enum class WeakTypeTag { NotSet, Primitive, Object, String };
  63. WeakTypeTag m_tag { WeakTypeTag::NotSet };
  64. union WeakValueUnion {
  65. WeakValueUnion()
  66. : primitive(JSValue())
  67. {
  68. }
  69. ~WeakValueUnion()
  70. {
  71. ASSERT(!primitive);
  72. }
  73. JSValue primitive;
  74. Weak<JSObject> object;
  75. Weak<JSString> string;
  76. } m_value;
  77. };
  78. } // namespace JSC