/ API / JSWeakValue.cpp
JSWeakValue.cpp
 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  
27  #include "config.h"
28  #include "JSWeakValue.h"
29  
30  #include "JSCInlines.h"
31  
32  namespace JSC {
33  
34  JSWeakValue::~JSWeakValue()
35  {
36      clear();
37  }
38  
39  void JSWeakValue::clear()
40  {
41      switch (m_tag) {
42      case WeakTypeTag::NotSet:
43          return;
44      case WeakTypeTag::Primitive:
45          m_value.primitive = JSValue();
46          return;
47      case WeakTypeTag::Object:
48          m_value.object.clear();
49          return;
50      case WeakTypeTag::String:
51          m_value.string.clear();
52          return;
53      }
54      RELEASE_ASSERT_NOT_REACHED();
55  }
56  
57  bool JSWeakValue::isClear() const
58  {
59      switch (m_tag) {
60      case WeakTypeTag::NotSet:
61          return true;
62      case WeakTypeTag::Primitive:
63          return !m_value.primitive;
64      case WeakTypeTag::Object:
65          return !m_value.object;
66      case WeakTypeTag::String:
67          return !m_value.string;
68      }
69      RELEASE_ASSERT_NOT_REACHED();
70  }
71  
72  void JSWeakValue::setPrimitive(JSValue primitive)
73  {
74      ASSERT(!isSet());
75      ASSERT(!m_value.primitive);
76      ASSERT(primitive.isPrimitive());
77      m_tag = WeakTypeTag::Primitive;
78      m_value.primitive = primitive;
79  }
80  
81  void JSWeakValue::setObject(JSObject* object, WeakHandleOwner& owner, void* context)
82  {
83      ASSERT(!isSet());
84      ASSERT(!m_value.object);
85      m_tag = WeakTypeTag::Object;
86      Weak<JSObject> weak(object, &owner, context);
87      m_value.object.swap(weak);
88  }
89  
90  void JSWeakValue::setString(JSString* string, WeakHandleOwner& owner, void* context)
91  {
92      ASSERT(!isSet());
93      ASSERT(!m_value.string);
94      m_tag = WeakTypeTag::String;
95      Weak<JSString> weak(string, &owner, context);
96      m_value.string.swap(weak);
97  }
98  
99  } // namespace JSC