TypeSet.h
1 /* 2 * Copyright (C) 2008, 2014 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. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #pragma once 27 28 #include "ConcurrentJSLock.h" 29 #include "RuntimeType.h" 30 #include "StructureSet.h" 31 #include <wtf/HashSet.h> 32 #include <wtf/JSONValues.h> 33 #include <wtf/RefCounted.h> 34 #include <wtf/ThreadSafeRefCounted.h> 35 #include <wtf/text/WTFString.h> 36 #include <wtf/Vector.h> 37 38 namespace Inspector { 39 namespace Protocol { 40 41 namespace Runtime { 42 class StructureDescription; 43 class TypeSet; 44 } 45 46 } 47 } 48 49 namespace JSC { 50 51 class StructureShape : public RefCounted<StructureShape> { 52 friend class TypeSet; 53 54 public: 55 StructureShape(); 56 57 static Ref<StructureShape> create() { return adoptRef(*new StructureShape); } 58 String propertyHash(); 59 void markAsFinal(); 60 void addProperty(UniquedStringImpl&); 61 String stringRepresentation(); 62 String toJSONString() const; 63 Ref<Inspector::Protocol::Runtime::StructureDescription> inspectorRepresentation(); 64 void setConstructorName(String name) { m_constructorName = (name.isEmpty() ? "Object"_s : name); } 65 String constructorName() { return m_constructorName; } 66 void setProto(Ref<StructureShape>&& shape) { m_proto = WTFMove(shape); } 67 void enterDictionaryMode(); 68 69 private: 70 static String leastCommonAncestor(const Vector<Ref<StructureShape>>&); 71 static Ref<StructureShape> merge(Ref<StructureShape>&&, Ref<StructureShape>&&); 72 bool hasSamePrototypeChain(const StructureShape&); 73 74 bool m_final; 75 bool m_isInDictionaryMode; 76 HashSet<RefPtr<UniquedStringImpl>, IdentifierRepHash> m_fields; 77 HashSet<RefPtr<UniquedStringImpl>, IdentifierRepHash> m_optionalFields; 78 RefPtr<StructureShape> m_proto; 79 std::unique_ptr<String> m_propertyHash; 80 String m_constructorName; 81 }; 82 83 class TypeSet : public ThreadSafeRefCounted<TypeSet> { 84 85 public: 86 static Ref<TypeSet> create() { return adoptRef(*new TypeSet); } 87 TypeSet(); 88 void addTypeInformation(RuntimeType, RefPtr<StructureShape>&&, Structure*, bool sawPolyProtoStructure); 89 void invalidateCache(VM&); 90 String dumpTypes() const; 91 String displayName() const; 92 Ref<JSON::ArrayOf<Inspector::Protocol::Runtime::StructureDescription>> allStructureRepresentations() const; 93 String toJSONString() const; 94 bool isOverflown() const { return m_isOverflown; } 95 String leastCommonAncestor() const; 96 Ref<Inspector::Protocol::Runtime::TypeSet> inspectorTypeSet() const; 97 bool isEmpty() const { return m_seenTypes == TypeNothing; } 98 bool doesTypeConformTo(RuntimeTypeMask test) const; 99 RuntimeTypeMask seenTypes() const { return m_seenTypes; } 100 StructureSet structureSet(const ConcurrentJSLocker&) const { return m_structureSet; } 101 102 ConcurrentJSLock m_lock; 103 private: 104 bool m_isOverflown; 105 RuntimeTypeMask m_seenTypes; 106 Vector<Ref<StructureShape>> m_structureHistory; 107 StructureSet m_structureSet; 108 }; 109 110 } // namespace JSC