[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdelibs/khtml/css
From: Viacheslav Tokarev <tsjoker () gmail ! com>
Date: 2009-03-10 16:41:58
Message-ID: 1236703318.776488.16552.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 937862 by vtokarev:
Reorganize data structure that's used for going over properties related to one \
selector allocate all needed memory once, instead of reallocating later
M +33 -55 cssstyleselector.cpp
M +2 -2 cssstyleselector.h
--- trunk/KDE/kdelibs/khtml/css/cssstyleselector.cpp #937861:937862
@@ -657,30 +657,26 @@
checkSelector( i, e );
- if ( selectorCache[i].state == Applies ) {
- ++smatch;
-
-// qDebug("adding property" );
- for ( unsigned int p = 0; p < selectorCache[i].props_size; p += 2 )
- for ( unsigned int j = 0; j < (unsigned int )selectorCache[i].props[p+1]; ++j \
) {
- if (numPropsToApply >= propsToApplySize ) {
- propsToApplySize *= 2;
- propsToApply = (CSSOrderedProperty **)realloc( propsToApply, \
propsToApplySize*sizeof( CSSOrderedProperty * ) );
- }
- propsToApply[numPropsToApply++] = properties[selectorCache[i].props[p]+j];
- }
- } else if ( selectorCache[i].state == AppliesPseudo ) {
- for ( unsigned int p = 0; p < selectorCache[i].props_size; p += 2 )
- for ( unsigned int j = 0; j < (unsigned int) selectorCache[i].props[p+1]; ++j \
) {
- if (numPseudoProps >= pseudoPropsSize ) {
- pseudoPropsSize *= 2;
- pseudoProps = (CSSOrderedProperty **)realloc( pseudoProps, \
pseudoPropsSize*sizeof( CSSOrderedProperty * ) );
- }
- pseudoProps[numPseudoProps++] = properties[selectorCache[i].props[p]+j];
- properties[selectorCache[i].props[p]+j]->pseudoId = (RenderStyle::PseudoId) \
selectors[i]->pseudoId;
- }
- }
- }
+ if (selectorCache[i].state == Applies) {
+ ++smatch;
+ for (unsigned p = selectorCache[i].firstPropertyIndex; p < \
properties_size; p = nextPropertyIndexes[p]) { + if \
(numPropsToApply >= propsToApplySize ) { + propsToApplySize *= \
2; + propsToApply = (CSSOrderedProperty **)realloc( \
propsToApply, propsToApplySize*sizeof( CSSOrderedProperty * ) ); + \
} + propsToApply[numPropsToApply++] = properties[p];
+ }
+ } else if (selectorCache[i].state == AppliesPseudo) {
+ for (unsigned p = selectorCache[i].firstPropertyIndex; p < \
properties_size; p = nextPropertyIndexes[p]) { + if \
(numPseudoProps >= pseudoPropsSize ) { + pseudoPropsSize *= 2;
+ pseudoProps = (CSSOrderedProperty **)realloc( pseudoProps, \
pseudoPropsSize*sizeof( CSSOrderedProperty * ) ); + }
+ pseudoProps[numPseudoProps++] = properties[p];
+ properties[p]->pseudoId = (RenderStyle::PseudoId) \
selectors[i]->pseudoId; + }
+ }
+ }
else
selectorCache[i].state = Invalid;
@@ -1821,17 +1817,15 @@
void CSSStyleSelector::clearLists()
{
- delete [] selectors;
- if ( selectorCache ) {
- for ( unsigned int i = 0; i < selectors_size; i++ )
- delete [] selectorCache[i].props;
-
- delete [] selectorCache;
+ delete[] selectors;
+ if (selectorCache) {
+ delete[] selectorCache;
}
- if ( properties ) {
+ if (properties) {
CSSOrderedProperty **prop = properties;
delete[] propertiesBuffer;
delete[] properties;
+ delete[] nextPropertyIndexes;
}
selectors = 0;
properties = 0;
@@ -1955,32 +1949,16 @@
*prop = propertiesBuffer + i;
**prop = propertyList[i];
}
- *prop = 0;
- unsigned int* offsets = new unsigned int[selectors_size];
- if(properties[0])
- offsets[properties[0]->selector] = 0;
- for(unsigned int p = 1; p < properties_size; ++p) {
-
- if(!properties[p] || (properties[p]->selector != properties[p - 1]->selector)) {
- unsigned int sel = properties[p - 1]->selector;
- int* newprops = new int[selectorCache[sel].props_size+2];
- for ( unsigned int i=0; i < selectorCache[sel].props_size; i++ )
- newprops[i] = selectorCache[sel].props[i];
-
- newprops[selectorCache[sel].props_size] = offsets[sel];
- newprops[selectorCache[sel].props_size+1] = p - offsets[sel];
- delete [] selectorCache[sel].props;
- selectorCache[sel].props = newprops;
- selectorCache[sel].props_size += 2;
-
- if(properties[p]) {
- sel = properties[p]->selector;
- offsets[sel] = p;
- }
- }
+ // properties for one selector are not necessarily adjacent at this point
+ // prepare sublists with same selector
+ // create for every property next property index with same selector
+ nextPropertyIndexes = new unsigned[properties_size];
+ for (int i = properties_size - 1; i >= 0; --i) {
+ unsigned selector = propertiesBuffer[i].selector;
+ nextPropertyIndexes[i] = selectorCache[selector].firstPropertyIndex;
+ selectorCache[selector].firstPropertyIndex = i;
}
- delete [] offsets;
}
--- trunk/KDE/kdelibs/khtml/css/cssstyleselector.h #937861:937862
@@ -285,13 +285,13 @@
struct SelectorCache {
SelectorState state;
- unsigned int props_size;
- int *props;
+ unsigned firstPropertyIndex;
};
unsigned int selectors_size;
DOM::CSSSelector **selectors;
SelectorCache *selectorCache;
+ unsigned *nextPropertyIndexes;
unsigned int properties_size;
CSSOrderedProperty **properties;
CSSOrderedProperty *propertiesBuffer;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic