@@ -360,53 +360,54 @@ import { Array } from "./array";
360
360
}
361
361
362
362
replaceAll ( search : String , replacement : String ) : String {
363
- var len : usize = this . length ;
364
- var slen : usize = search . length ;
365
- if ( len <= slen ) {
366
- return len < slen ? this : select < String > ( replacement , this , search == this ) ;
367
- }
368
- var rlen : usize = replacement . length ;
369
- if ( ! slen ) {
370
- if ( ! rlen ) return this ;
363
+ var thisLen : usize = this . length ;
364
+ var searchLen : usize = search . length ;
365
+ if ( thisLen <= searchLen ) {
366
+ return thisLen < searchLen
367
+ ? this
368
+ : select < String > ( replacement , this , search == this ) ;
369
+ }
370
+ var replaceLen : usize = replacement . length ;
371
+ if ( ! searchLen ) {
372
+ if ( ! replaceLen ) return this ;
371
373
// Special case: 'abc'.replaceAll('', '-') -> '-a-b-c-'
372
- let out = __new ( ( len + ( len + 1 ) * rlen ) << 1 , idof < String > ( ) ) ;
373
- memory . copy ( out , changetype < usize > ( replacement ) , rlen << 1 ) ;
374
- let offset = rlen ;
375
- for ( let i : usize = 0 ; i < len ; ++ i ) {
374
+ let out = __new ( ( thisLen + ( thisLen + 1 ) * replaceLen ) << 1 , idof < String > ( ) ) ;
375
+ memory . copy ( out , changetype < usize > ( replacement ) , replaceLen << 1 ) ;
376
+ let offset = replaceLen ;
377
+ for ( let i : usize = 0 ; i < thisLen ; ++ i ) {
376
378
store < u16 > (
377
379
changetype < usize > ( out ) + ( offset ++ << 1 ) ,
378
380
load < u16 > ( changetype < usize > ( this ) + ( i << 1 ) )
379
381
) ;
380
382
memory . copy (
381
383
out + ( offset << 1 ) ,
382
384
changetype < usize > ( replacement ) ,
383
- rlen << 1
385
+ replaceLen << 1
384
386
) ;
385
- offset += rlen ;
387
+ offset += replaceLen ;
386
388
}
387
389
return changetype < String > ( out ) ;
388
390
}
389
391
var prev : isize = 0 , next : isize = 0 ;
390
- if ( slen == rlen ) {
392
+ if ( searchLen == replaceLen ) {
391
393
// Fast path when search and replacement have same length
392
- let size = len << 1 ;
393
- let out = __new ( size , idof < String > ( ) ) ;
394
- memory . copy ( out , changetype < usize > ( this ) , size ) ;
394
+ let outSize = thisLen << 1 ;
395
+ let out = __new ( outSize , idof < String > ( ) ) ;
396
+ memory . copy ( out , changetype < usize > ( this ) , outSize ) ;
395
397
while ( ~ ( next = < isize > this . indexOf ( search , < i32 > prev ) ) ) {
396
- memory . copy ( out + ( next << 1 ) , changetype < usize > ( replacement ) , rlen << 1 ) ;
397
- prev = next + slen ;
398
+ memory . copy ( out + ( next << 1 ) , changetype < usize > ( replacement ) , replaceLen << 1 ) ;
399
+ prev = next + searchLen ;
398
400
}
399
401
return changetype < String > ( out ) ;
400
402
}
401
- var out : usize = 0 , offset : usize = 0 , resLen = len ;
403
+ var out : usize = 0 , offset : usize = 0 , outSize = thisLen ;
402
404
while ( ~ ( next = < isize > this . indexOf ( search , < i32 > prev ) ) ) {
403
- if ( ! out ) out = __new ( len << 1 , idof < String > ( ) ) ;
404
- if ( offset > resLen ) {
405
- let newLength = resLen << 1 ;
406
- out = __renew ( out , newLength << 1 ) ;
407
- resLen = newLength ;
408
- }
405
+ if ( ! out ) out = __new ( thisLen << 1 , idof < String > ( ) ) ;
409
406
let chunk = next - prev ;
407
+ if ( offset + chunk + replaceLen > outSize ) {
408
+ outSize <<= 1 ;
409
+ out = __renew ( out , outSize << 1 ) ;
410
+ }
410
411
memory . copy (
411
412
out + ( offset << 1 ) ,
412
413
changetype < usize > ( this ) + ( prev << 1 ) ,
@@ -416,18 +417,17 @@ import { Array } from "./array";
416
417
memory . copy (
417
418
out + ( offset << 1 ) ,
418
419
changetype < usize > ( replacement ) ,
419
- rlen << 1
420
+ replaceLen << 1
420
421
) ;
421
- offset += rlen ;
422
- prev = next + slen ;
422
+ offset += replaceLen ;
423
+ prev = next + searchLen ;
423
424
}
424
425
if ( offset ) {
425
- if ( offset > resLen ) {
426
- let newLength = resLen << 1 ;
427
- out = __renew ( out , newLength << 1 ) ;
428
- resLen = newLength ;
426
+ let rest = thisLen - prev ;
427
+ if ( offset + rest > outSize ) {
428
+ outSize <<= 1 ;
429
+ out = __renew ( out , outSize << 1 ) ;
429
430
}
430
- let rest = len - prev ;
431
431
if ( rest ) {
432
432
memory . copy (
433
433
out + ( offset << 1 ) ,
@@ -436,7 +436,9 @@ import { Array } from "./array";
436
436
) ;
437
437
}
438
438
rest += offset ;
439
- if ( resLen > rest ) out = __renew ( out , rest << 1 ) ;
439
+ if ( outSize > rest ) {
440
+ out = __renew ( out , rest << 1 ) ;
441
+ }
440
442
return changetype < String > ( out ) ;
441
443
}
442
444
return this ;
0 commit comments