Changeset 48068 in webkit for trunk/JavaScriptCore/runtime/JSArray.h
- Timestamp:
- Sep 4, 2009, 12:03:33 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/JSArray.h
r47812 r48068 122 122 JSArray* constructArray(ExecState*, const ArgList& values); 123 123 124 inline JSArray* asArray(JSCell* cell) 125 { 126 ASSERT(cell->inherits(&JSArray::info)); 127 return static_cast<JSArray*>(cell); 128 } 129 124 130 inline JSArray* asArray(JSValue value) 125 131 { 126 ASSERT(asObject(value)->inherits(&JSArray::info)); 127 return static_cast<JSArray*>(asObject(value)); 128 } 129 130 inline bool isJSArray(JSGlobalData* globalData, JSValue v) { return v.isCell() && v.asCell()->vptr() == globalData->jsArrayVPtr; } 132 return asArray(value.asCell()); 133 } 134 135 inline bool isJSArray(JSGlobalData* globalData, JSValue v) 136 { 137 return v.isCell() && v.asCell()->vptr() == globalData->jsArrayVPtr; 138 } 131 139 inline bool isJSArray(JSGlobalData* globalData, JSCell* cell) { return cell->vptr() == globalData->jsArrayVPtr; } 132 140 133 void JSArray::markChildrenDirect(MarkStack& markStack) { 141 inline void JSArray::markChildrenDirect(MarkStack& markStack) 142 { 134 143 JSObject::markChildrenDirect(markStack); 135 144 136 145 ArrayStorage* storage = m_storage; 137 146 138 147 unsigned usedVectorLength = std::min(storage->m_length, storage->m_vectorLength); 139 148 markStack.appendValues(storage->m_vector, usedVectorLength, MayContainNullValues); 140 149 141 150 if (SparseArrayValueMap* map = storage->m_sparseValueMap) { 142 151 SparseArrayValueMap::iterator end = map->end(); … … 144 153 markStack.append(it->second); 145 154 } 155 } 156 157 inline void MarkStack::markChildren(JSCell* cell) 158 { 159 ASSERT(Heap::isCellMarked(cell)); 160 if (cell->structure()->typeInfo().hasDefaultMark()) { 161 #ifdef NDEBUG 162 asObject(cell)->markChildrenDirect(*this); 163 #else 164 ASSERT(!m_isCheckingForDefaultMarkViolation); 165 m_isCheckingForDefaultMarkViolation = true; 166 cell->markChildren(*this); 167 ASSERT(m_isCheckingForDefaultMarkViolation); 168 m_isCheckingForDefaultMarkViolation = false; 169 #endif 170 return; 171 } 172 if (cell->vptr() == m_jsArrayVPtr) { 173 asArray(cell)->markChildrenDirect(*this); 174 return; 175 } 176 cell->markChildren(*this); 146 177 } 147 178 … … 158 189 findNextUnmarkedNullValue: 159 190 ASSERT(current.m_values != end); 160 JSValue v = *current.m_values;191 JSValue value = *current.m_values; 161 192 current.m_values++; 162 163 if (!v || v.marked()) { 193 194 JSCell* cell; 195 if (!value || !value.isCell() || Heap::isCellMarked(cell = value.asCell())) { 164 196 if (current.m_values == end) { 165 197 m_markSets.removeLast(); … … 168 200 goto findNextUnmarkedNullValue; 169 201 } 170 171 JSCell* currentCell = v.asCell(); 172 currentCell->markCellDirect(); 173 if (currentCell->structure()->typeInfo().type() < CompoundType) { 202 203 Heap::markCell(cell); 204 if (cell->structure()->typeInfo().type() < CompoundType) { 174 205 if (current.m_values == end) { 175 206 m_markSets.removeLast(); … … 178 209 goto findNextUnmarkedNullValue; 179 210 } 180 211 181 212 if (current.m_values == end) 182 213 m_markSets.removeLast(); 183 214 184 if (currentCell->structure()->typeInfo().hasDefaultMark()) 185 static_cast<JSObject*>(currentCell)->markChildrenDirect(*this); 186 else if (currentCell->vptr() == m_jsArrayVPtr) 187 static_cast<JSArray*>(currentCell)->markChildrenDirect(*this); 188 else 189 currentCell->markChildren(*this); 215 markChildren(cell); 190 216 } 191 while (!m_values.isEmpty()) { 192 JSCell* current = m_values.removeLast(); 193 ASSERT(current->marked()); 194 if (current->structure()->typeInfo().hasDefaultMark()) 195 static_cast<JSObject*>(current)->markChildrenDirect(*this); 196 else if (current->vptr() == m_jsArrayVPtr) 197 static_cast<JSArray*>(current)->markChildrenDirect(*this); 198 else 199 current->markChildren(*this); 200 } 217 while (!m_values.isEmpty()) 218 markChildren(m_values.removeLast()); 201 219 } 202 220 }
Note:
See TracChangeset
for help on using the changeset viewer.