Changeset 94477 in webkit for trunk/Source/JavaScriptCore/bytecode/ValueProfile.h
- Timestamp:
- Sep 2, 2011, 10:14:04 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecode/ValueProfile.h
r93466 r94477 30 30 #define ValueProfile_h 31 31 32 #include "JSArray.h" 33 #include "Structure.h" 32 34 #include "WriteBarrier.h" 33 35 … … 46 48 { 47 49 for (unsigned i = 0; i < numberOfBuckets; ++i) 48 buckets[i].setWithoutWriteBarrier(JSValue()); 50 buckets[i] = JSValue::encode(JSValue()); 51 } 52 53 const ClassInfo* classInfo(unsigned bucket) const 54 { 55 if (!!buckets[bucket]) { 56 JSValue value = JSValue::decode(buckets[bucket]); 57 if (!value.isCell()) 58 return 0; 59 return value.asCell()->structure()->classInfo(); 60 } 61 return weakBuckets[bucket].getClassInfo(); 49 62 } 50 63 … … 53 66 unsigned result = 0; 54 67 for (unsigned i = 0; i < numberOfBuckets; ++i) { 55 if (!!buckets[i] )68 if (!!buckets[i] || !!weakBuckets[i]) 56 69 result++; 57 70 } … … 70 83 unsigned result = 0; 71 84 for (unsigned i = 0; i < numberOfBuckets; ++i) { 72 if (!!buckets[i] && buckets[i].get().isInt32())85 if (!!buckets[i] && JSValue::decode(buckets[i]).isInt32()) 73 86 result++; 74 87 } … … 80 93 unsigned result = 0; 81 94 for (unsigned i = 0; i < numberOfBuckets; ++i) { 82 if (!!buckets[i] && buckets[i].get().isDouble())95 if (!!buckets[i] && JSValue::decode(buckets[i]).isDouble()) 83 96 result++; 84 97 } … … 90 103 unsigned result = 0; 91 104 for (unsigned i = 0; i < numberOfBuckets; ++i) { 92 if (!!buckets[i] && buckets[i].get().isCell()) 105 if (!!classInfo(i)) 106 result++; 107 } 108 return result; 109 } 110 111 unsigned numberOfArrays() const 112 { 113 unsigned result = 0; 114 for (unsigned i = 0; i < numberOfBuckets; ++i) { 115 if (classInfo(i) == &JSArray::s_info) 93 116 result++; 94 117 } … … 116 139 } 117 140 141 unsigned probabilityOfArray() const 142 { 143 return computeProbability(numberOfArrays(), numberOfSamples()); 144 } 145 118 146 int bytecodeOffset; // -1 for prologue 119 WriteBarrierBase<Unknown> buckets[numberOfBuckets]; 147 EncodedJSValue buckets[numberOfBuckets]; 148 149 class WeakBucket { 150 public: 151 WeakBucket() 152 : m_value(0) 153 { 154 } 155 156 WeakBucket(Structure* structure) 157 : m_value(reinterpret_cast<uintptr_t>(structure)) 158 { 159 } 160 161 WeakBucket(const ClassInfo* classInfo) 162 : m_value(reinterpret_cast<uintptr_t>(classInfo) | 1) 163 { 164 } 165 166 bool operator!() const 167 { 168 return !m_value; 169 } 170 171 bool isEmpty() const 172 { 173 return !m_value; 174 } 175 176 bool isClassInfo() const 177 { 178 return !!(m_value & 1); 179 } 180 181 bool isStructure() const 182 { 183 return !isEmpty() && !isClassInfo(); 184 } 185 186 Structure* asStructure() const 187 { 188 ASSERT(isStructure()); 189 return reinterpret_cast<Structure*>(m_value); 190 } 191 192 const ClassInfo* asClassInfo() const 193 { 194 ASSERT(isClassInfo()); 195 return reinterpret_cast<ClassInfo*>(m_value & ~static_cast<uintptr_t>(1)); 196 } 197 198 const ClassInfo* getClassInfo() const 199 { 200 if (isEmpty()) 201 return 0; 202 if (isClassInfo()) 203 return asClassInfo(); 204 return asStructure()->classInfo(); 205 } 206 207 private: 208 uintptr_t m_value; 209 }; 210 211 WeakBucket weakBuckets[numberOfBuckets]; // this is not covered by a write barrier because it is only set from GC 120 212 }; 121 213
Note:
See TracChangeset
for help on using the changeset viewer.