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