@@ -43,7 +43,6 @@ import { idof } from "./builtins";
43
43
}
44
44
45
45
@operator ( "[]" ) charAt ( pos : i32 ) : String {
46
- assert ( this !== null ) ;
47
46
if ( < u32 > pos >= < u32 > this . length ) return changetype < String > ( "" ) ;
48
47
var out = __alloc ( 2 , idof < String > ( ) ) ;
49
48
store < u16 > ( out , load < u16 > ( changetype < usize > ( this ) + ( < usize > pos << 1 ) ) ) ;
@@ -81,7 +80,6 @@ import { idof } from "./builtins";
81
80
}
82
81
83
82
endsWith ( search : String , end : i32 = String . MAX_LENGTH ) : bool {
84
- assert ( this !== null ) ;
85
83
if ( search === null ) return false ;
86
84
end = min ( max ( end , 0 ) , this . length ) ;
87
85
var searchLength = < isize > search . length ;
@@ -169,7 +167,6 @@ import { idof } from "./builtins";
169
167
}
170
168
171
169
startsWith ( search : String , start : i32 = 0 ) : bool {
172
- assert ( this !== null ) ;
173
170
if ( search === null ) search = changetype < String > ( "null" ) ;
174
171
var len = < isize > this . length ;
175
172
var searchStart = min ( max ( < isize > start , 0 ) , len ) ;
@@ -180,7 +177,6 @@ import { idof } from "./builtins";
180
177
}
181
178
182
179
substr ( start : i32 , length : i32 = i32 . MAX_VALUE ) : String { // legacy
183
- assert ( this !== null ) ;
184
180
var intStart : isize = start ;
185
181
var end : isize = length ;
186
182
var size : isize = this . length ;
@@ -193,7 +189,6 @@ import { idof } from "./builtins";
193
189
}
194
190
195
191
substring ( start : i32 , end : i32 = i32 . MAX_VALUE ) : String {
196
- assert ( this !== null ) ;
197
192
var len : isize = this . length ;
198
193
var finalStart = min < isize > ( max ( start , 0 ) , len ) ;
199
194
var finalEnd = min < isize > ( max ( end , 0 ) , len ) ;
@@ -208,7 +203,6 @@ import { idof } from "./builtins";
208
203
}
209
204
210
205
trim ( ) : String {
211
- assert ( this !== null ) ;
212
206
var length = this . length ;
213
207
var size : usize = length << 1 ;
214
208
while (
@@ -246,7 +240,6 @@ import { idof } from "./builtins";
246
240
}
247
241
248
242
trimStart ( ) : String {
249
- assert ( this !== null ) ;
250
243
var size = < usize > this . length << 1 ;
251
244
var offset : usize = 0 ;
252
245
while (
@@ -266,7 +259,6 @@ import { idof } from "./builtins";
266
259
}
267
260
268
261
trimEnd ( ) : String {
269
- assert ( this !== null ) ;
270
262
var originalSize = < usize > this . length << 1 ;
271
263
var size = originalSize ;
272
264
while (
@@ -285,7 +277,6 @@ import { idof } from "./builtins";
285
277
}
286
278
287
279
padStart ( length : i32 , pad : string = " " ) : String {
288
- assert ( this !== null ) ;
289
280
var thisSize = < usize > this . length << 1 ;
290
281
var targetSize = < usize > length << 1 ;
291
282
var padSize = < usize > pad . length << 1 ;
@@ -306,7 +297,6 @@ import { idof } from "./builtins";
306
297
}
307
298
308
299
padEnd ( length : i32 , pad : string = " " ) : String {
309
- assert ( this !== null ) ;
310
300
var thisSize = < usize > this . length << 1 ;
311
301
var targetSize = < usize > length << 1 ;
312
302
var padSize = < usize > pad . length << 1 ;
@@ -327,7 +317,6 @@ import { idof } from "./builtins";
327
317
}
328
318
329
319
repeat ( count : i32 = 0 ) : String {
330
- assert ( this !== null ) ;
331
320
var length = this . length ;
332
321
333
322
// Most browsers can't handle strings 1 << 28 chars or longer
@@ -342,8 +331,121 @@ import { idof } from "./builtins";
342
331
return changetype < String > ( out ) ; // retains
343
332
}
344
333
334
+ replace ( search : String , replacement : String ) : String {
335
+ var len : usize = this . length ;
336
+ var slen : usize = search . length ;
337
+ if ( len <= slen ) {
338
+ return len < slen ? this : select < String > ( replacement , this , search == this ) ;
339
+ }
340
+ var index : isize = this . indexOf ( search ) ;
341
+ if ( ~ index ) {
342
+ let rlen : usize = replacement . length ;
343
+ len -= slen ;
344
+ let olen = len + rlen ;
345
+ if ( olen ) {
346
+ let out = __alloc ( olen << 1 , idof < String > ( ) ) ;
347
+ memory . copy ( out , changetype < usize > ( this ) , index << 1 ) ;
348
+ memory . copy (
349
+ out + ( index << 1 ) ,
350
+ changetype < usize > ( replacement ) ,
351
+ rlen << 1
352
+ ) ;
353
+ memory . copy (
354
+ out + ( ( index + rlen ) << 1 ) ,
355
+ changetype < usize > ( this ) + ( ( index + slen ) << 1 ) ,
356
+ ( len - index ) << 1
357
+ ) ;
358
+ return changetype < String > ( out ) ;
359
+ }
360
+ }
361
+ return this ;
362
+ }
363
+
364
+ replaceAll ( search : String , replacement : String ) : String {
365
+ var len : usize = this . length ;
366
+ var slen : usize = search . length ;
367
+ if ( len <= slen ) {
368
+ return len < slen ? this : select < String > ( replacement , this , search == this ) ;
369
+ }
370
+ var rlen : usize = replacement . length ;
371
+ if ( ! slen ) {
372
+ if ( ! rlen ) return this ;
373
+ // Special case: 'abc'.replaceAll('', '-') -> '-a-b-c-'
374
+ let out = __alloc ( ( len + ( len + 1 ) * rlen ) << 1 , idof < String > ( ) ) ;
375
+ memory . copy ( out , changetype < usize > ( replacement ) , rlen << 1 ) ;
376
+ let offset = rlen ;
377
+ for ( let i : usize = 0 ; i < len ; ++ i ) {
378
+ store < u16 > (
379
+ changetype < usize > ( out ) + ( offset ++ << 1 ) ,
380
+ load < u16 > ( changetype < usize > ( this ) + ( i << 1 ) )
381
+ ) ;
382
+ memory . copy (
383
+ out + ( offset << 1 ) ,
384
+ changetype < usize > ( replacement ) ,
385
+ rlen << 1
386
+ ) ;
387
+ offset += rlen ;
388
+ }
389
+ return changetype < String > ( out ) ;
390
+ }
391
+ var prev : isize = 0 , next : isize = 0 ;
392
+ if ( slen == rlen ) {
393
+ // Fast path when search and replacement have same length
394
+ let size = len << 1 ;
395
+ let out = __alloc ( size , idof < String > ( ) ) ;
396
+ memory . copy ( out , changetype < usize > ( this ) , size ) ;
397
+ while ( ~ ( next = < isize > this . indexOf ( search , < i32 > prev ) ) ) {
398
+ memory . copy ( out + ( next << 1 ) , changetype < usize > ( replacement ) , rlen << 1 ) ;
399
+ prev = next + slen ;
400
+ }
401
+ return changetype < String > ( out ) ;
402
+ }
403
+ var out : usize = 0 , offset : usize = 0 , resLen = len ;
404
+ while ( ~ ( next = < isize > this . indexOf ( search , < i32 > prev ) ) ) {
405
+ if ( ! out ) out = __alloc ( len << 1 , idof < String > ( ) ) ;
406
+ if ( offset > resLen ) {
407
+ let newLength = resLen << 1 ;
408
+ out = __realloc ( out , newLength << 1 ) ;
409
+ resLen = newLength ;
410
+ }
411
+ let chunk = next - prev ;
412
+ memory . copy (
413
+ out + ( offset << 1 ) ,
414
+ changetype < usize > ( this ) + ( prev << 1 ) ,
415
+ chunk << 1
416
+ ) ;
417
+ offset += chunk ;
418
+ memory . copy (
419
+ out + ( offset << 1 ) ,
420
+ changetype < usize > ( replacement ) ,
421
+ rlen << 1
422
+ ) ;
423
+ offset += rlen ;
424
+ prev = next + slen ;
425
+ }
426
+ if ( offset ) {
427
+ if ( offset > resLen ) {
428
+ let newLength = resLen << 1 ;
429
+ out = __realloc ( out , newLength << 1 ) ;
430
+ resLen = newLength ;
431
+ }
432
+ let rest = len - prev ;
433
+ if ( rest ) {
434
+ memory . copy (
435
+ out + ( offset << 1 ) ,
436
+ changetype < usize > ( this ) + ( prev << 1 ) ,
437
+ rest << 1
438
+ ) ;
439
+ }
440
+ rest += offset ;
441
+ if ( resLen > rest ) out = __realloc ( out , rest << 1 ) ;
442
+ return changetype < String > ( out ) ;
443
+ }
444
+ return this ;
445
+ }
446
+
345
447
slice ( start : i32 , end : i32 = i32 . MAX_VALUE ) : String {
346
- var len = this . length ;
448
+ var len = this . length ;
347
449
start = start < 0 ? max ( start + len , 0 ) : min ( start , len ) ;
348
450
end = end < 0 ? max ( end + len , 0 ) : min ( end , len ) ;
349
451
len = end - start ;
@@ -354,7 +456,6 @@ import { idof } from "./builtins";
354
456
}
355
457
356
458
split ( separator : String | null = null , limit : i32 = i32 . MAX_VALUE ) : String [ ] {
357
- assert ( this !== null ) ;
358
459
if ( ! limit ) return changetype < Array < String > > ( __allocArray ( 0 , alignof < String > ( ) , idof < Array < String > > ( ) ) ) ; // retains
359
460
if ( separator === null ) return < String [ ] > [ this ] ;
360
461
var length : isize = this . length ;
@@ -380,7 +481,7 @@ import { idof } from "./builtins";
380
481
}
381
482
var result = changetype < Array < String > > ( __allocArray ( 0 , alignof < String > ( ) , idof < Array < String > > ( ) ) ) ; // retains
382
483
var end = 0 , start = 0 , i = 0 ;
383
- while ( ( end = this . indexOf ( separator , start ) ) != - 1 ) {
484
+ while ( ~ ( end = this . indexOf ( separator , start ) ) ) {
384
485
let len = end - start ;
385
486
if ( len > 0 ) {
386
487
let out = __alloc ( < usize > len << 1 , idof < String > ( ) ) ;
0 commit comments