@@ -66,7 +66,7 @@ Idle mem after: 120 MB
6666*/
6767
6868var filterDict = { } ;
69- var filterDictFrozenCount = 0 ;
69+ var filterCount = 0 ;
7070var filterIndex = { } ;
7171
7272var reIgnoreFilter = / ^ \[ | ^ ! | # # | @ # | @ @ | ^ \| h t t p / ;
@@ -83,12 +83,7 @@ var FilterEntry = function(s, tokenBeg, tokenLen) {
8383 this . s = s ;
8484 this . tokenBeg = tokenBeg ;
8585 this . tokenLen = tokenLen ;
86- } ;
87-
88- FilterEntry . prototype . matchString = function ( s , tokenBeg ) {
89- // rhill 2014-03-05: Benchmarking shows that's the fastest way to do this.
90- var filterBeg = tokenBeg - this . tokenBeg ;
91- return s . indexOf ( this . s , filterBeg ) === filterBeg ;
86+ this . next = undefined ;
9287} ;
9388
9489/******************************************************************************/
@@ -97,7 +92,7 @@ FilterEntry.prototype.matchString = function(s, tokenBeg) {
9792
9893var reset = function ( ) {
9994 filterDict = { } ;
100- filterDictFrozenCount = 0 ;
95+ filterCount = 0 ;
10196 filterIndex = { } ;
10297} ;
10398
@@ -133,11 +128,6 @@ var findGoodToken = function(s) {
133128/******************************************************************************/
134129
135130var add = function ( s ) {
136- if ( filterDictFrozenCount !== 0 ) {
137- console . error ( "abpFilter.add()> Can't add, I'm frozen!" ) ;
138- return false ;
139- }
140-
141131 // Ignore unsupported filters
142132 if ( reIgnoreFilter . test ( s ) ) {
143133 return false ;
@@ -195,88 +185,83 @@ var add = function(s) {
195185 filter = new FilterEntry ( s , tokenBeg , token . length ) ;
196186 filterDict [ s ] = filter ;
197187
198- var prefixKey = tokenBeg > 0 ? s . charAt ( tokenBeg - 1 ) : '0 ' ;
199- var suffixKey = tokenEnd < s . length ? s . charAt ( tokenEnd ) : '0' ;
188+ var prefixKey = tokenBeg > 0 ? s . charAt ( tokenBeg - 1 ) : '' ;
189+ var suffixKey = s . substr ( tokenEnd , 2 ) ;
200190
201191 var fidx = filterIndex ;
202192 var tokenKey = prefixKey + token + suffixKey ;
203- var tokenEntry = fidx [ tokenKey ] ;
204- if ( tokenEntry === undefined ) {
205- fidx [ tokenKey ] = filter ;
206- } else if ( tokenEntry instanceof FilterEntry ) {
207- fidx [ tokenKey ] = [ tokenEntry , filter ] ;
208- } else {
209- tokenEntry . push ( filter ) ;
210- }
193+ filter . next = fidx [ tokenKey ] ;
194+ fidx [ tokenKey ] = filter ;
195+ filterCount += 1 ;
211196
212197 return true ;
213198} ;
214199
215200/******************************************************************************/
216201
217202var freeze = function ( ) {
218- filterDictFrozenCount = Object . keys ( filterDict ) . length ;
219- filterDict = null ;
203+ filterDict = { } ;
220204} ;
221205
222206/******************************************************************************/
223207
224- var matchFromFilterArray = function ( s , tokenBeg , tokenEnd , filters ) {
225- var i = filters . length ;
226- while ( i -- ) {
227- if ( filters [ i ] . matchString ( s , tokenBeg ) ) {
228- return true ;
208+ var matchStringToFilterChain = function ( filter , s , tokenBeg ) {
209+ var filterBeg ;
210+ while ( filter ) {
211+ // rhill 2014-03-05: Benchmarking shows that's the fastest way to do this.
212+ filterBeg = tokenBeg - filter . tokenBeg ;
213+ if ( s . indexOf ( filter . s , filterBeg ) === filterBeg ) {
214+ return true
229215 }
216+ filter = filter . next ;
230217 }
231218 return false ;
232219} ;
233220
234221/******************************************************************************/
235222
236- var matchFromSomething = function ( s , tokenBeg , tokenEnd , something ) {
237- if ( something === undefined ) {
238- return false ;
239- }
240- if ( something instanceof FilterEntry ) {
241- return something . matchString ( s , tokenBeg ) ;
242- }
243- return matchFromFilterArray ( s , tokenBeg , tokenEnd , something ) ;
244- } ;
245-
246- /******************************************************************************/
247-
248223var matchString = function ( s ) {
249- var sLen = s . length ;
224+ var fidx = filterIndex ;
250225 var matches ;
251226 var token ;
252227 var tokenBeg , tokenEnd ;
253228 var prefixKey , suffixKey ;
254- var fidx = filterIndex ;
229+ var matchFn = matchStringToFilterChain ;
255230
256231 reToken . lastIndex = 0 ;
257232 while ( matches = reToken . exec ( s ) ) {
258233 token = matches [ 0 ] ;
259234 tokenBeg = matches . index ;
260235 tokenEnd = reToken . lastIndex ;
261- prefixKey = tokenBeg > 0 ? s . charAt ( matches . index - 1 ) : false ;
262- suffixKey = tokenEnd < sLen ? s . charAt ( tokenEnd ) : false ;
236+ prefixKey = tokenBeg > 0 ? s . charAt ( matches . index - 1 ) : '' ;
237+ suffixKey = s . substr ( tokenEnd , 2 ) ;
263238
239+ if ( prefixKey && suffixKey . length > 1 ) {
240+ if ( matchFn ( fidx [ prefixKey + token + suffixKey ] , s , tokenBeg ) ) {
241+ return true ;
242+ }
243+ }
264244 if ( prefixKey && suffixKey ) {
265- if ( matchFromSomething ( s , tokenBeg , tokenEnd , fidx [ prefixKey + token + suffixKey ] ) ) {
245+ if ( matchFn ( fidx [ prefixKey + token + suffixKey . charAt ( 0 ) ] , s , tokenBeg ) ) {
266246 return true ;
267247 }
268248 }
269249 if ( prefixKey ) {
270- if ( matchFromSomething ( s , tokenBeg , tokenEnd , fidx [ prefixKey + token + '0' ] ) ) {
250+ if ( matchFn ( fidx [ prefixKey + token ] , s , tokenBeg ) ) {
251+ return true ;
252+ }
253+ }
254+ if ( suffixKey . length > 1 ) {
255+ if ( matchFn ( fidx [ token + suffixKey ] , s , tokenBeg ) ) {
271256 return true ;
272257 }
273258 }
274259 if ( suffixKey ) {
275- if ( matchFromSomething ( s , tokenBeg , tokenEnd , fidx [ '0' + token + suffixKey ] ) ) {
260+ if ( matchFn ( fidx [ token + suffixKey . charAt ( 0 ) ] , s , tokenBeg ) ) {
276261 return true ;
277262 }
278263 }
279- if ( matchFromSomething ( s , tokenBeg , tokenEnd , fidx [ '0' + token + '0' ] ) ) {
264+ if ( matchFn ( fidx [ token ] , s , tokenBeg ) ) {
280265 return true ;
281266 }
282267 }
@@ -287,7 +272,7 @@ var matchString = function(s) {
287272/******************************************************************************/
288273
289274var getFilterCount = function ( ) {
290- return filterDictFrozenCount ;
275+ return filterCount ;
291276} ;
292277
293278/******************************************************************************/
0 commit comments