CachedSpecialPropertyAdaptiveStructureWatchpoint.cpp
1 /* 2 * Copyright (C) 2019-2020 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #include "config.h" 27 #include "CachedSpecialPropertyAdaptiveStructureWatchpoint.h" 28 29 #include "JSCellInlines.h" 30 #include "StructureRareData.h" 31 32 namespace JSC { 33 34 CachedSpecialPropertyAdaptiveStructureWatchpoint::CachedSpecialPropertyAdaptiveStructureWatchpoint(const ObjectPropertyCondition& key, StructureRareData* structureRareData) 35 : Watchpoint(Watchpoint::Type::CachedSpecialPropertyAdaptiveStructure) 36 , m_structureRareData(structureRareData) 37 , m_key(key) 38 { 39 RELEASE_ASSERT(key.watchingRequiresStructureTransitionWatchpoint()); 40 RELEASE_ASSERT(!key.watchingRequiresReplacementWatchpoint()); 41 } 42 43 void CachedSpecialPropertyAdaptiveStructureWatchpoint::install(VM& vm) 44 { 45 RELEASE_ASSERT(m_key.isWatchable()); 46 47 m_key.object()->structure(vm)->addTransitionWatchpoint(this); 48 } 49 50 void CachedSpecialPropertyAdaptiveStructureWatchpoint::fireInternal(VM& vm, const FireDetail&) 51 { 52 if (!m_structureRareData->isLive()) 53 return; 54 55 if (m_key.isWatchable(PropertyCondition::EnsureWatchability)) { 56 install(vm); 57 return; 58 } 59 60 CachedSpecialPropertyKey key = CachedSpecialPropertyKey::ToStringTag; 61 if (m_key.uid() == vm.propertyNames->toStringTagSymbol.impl()) 62 key = CachedSpecialPropertyKey::ToStringTag; 63 else if (m_key.uid() == vm.propertyNames->toString.impl()) 64 key = CachedSpecialPropertyKey::ToString; 65 else if (m_key.uid() == vm.propertyNames->valueOf.impl()) 66 key = CachedSpecialPropertyKey::ValueOf; 67 else { 68 ASSERT(m_key.uid() == vm.propertyNames->toPrimitiveSymbol.impl()); 69 key = CachedSpecialPropertyKey::ToPrimitive; 70 } 71 72 m_structureRareData->clearCachedSpecialProperty(key); 73 } 74 75 } // namespace JSC