Skip to content

Commit 241a7f5

Browse files
MaxGraeydcodeIO
authored andcommitted
Fix String#substr and optimize String#substring + tests (#979)
1 parent 2a83652 commit 241a7f5

16 files changed

+2626
-1713
lines changed

std/assembly/string.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -174,12 +174,12 @@ import { idof } from "./builtins";
174174
substr(start: i32, length: i32 = i32.MAX_VALUE): String { // legacy
175175
var intStart: isize = start;
176176
var end: isize = length;
177-
var size: isize = this.length;
178-
if (intStart < 0) intStart = max(size + intStart, 0);
179-
var resultLength = min(max(end, 0), size - intStart);
180-
if (resultLength <= 0) return changetype<String>("");
181-
var out = __alloc(resultLength << 1, idof<String>());
182-
memory.copy(out, changetype<usize>(this) + intStart, resultLength);
177+
var len: isize = this.length;
178+
if (intStart < 0) intStart = max(len + intStart, 0);
179+
var size = min(max(end, 0), len - intStart) << 1;
180+
if (size <= 0) return changetype<String>("");
181+
var out = __alloc(size, idof<String>());
182+
memory.copy(out, changetype<usize>(this) + (intStart << 1), size);
183183
return changetype<String>(out); // retains
184184
}
185185

@@ -189,17 +189,17 @@ import { idof } from "./builtins";
189189
var finalEnd = min<isize>(max(end, 0), len);
190190
var fromPos = min<isize>(finalStart, finalEnd) << 1;
191191
var toPos = max<isize>(finalStart, finalEnd) << 1;
192-
len = toPos - fromPos;
193-
if (!len) return changetype<String>("");
194-
if (!fromPos && toPos == this.length << 1) return this;
195-
var out = __alloc(len, idof<String>());
196-
memory.copy(out, changetype<usize>(this) + fromPos, len);
192+
var size = toPos - fromPos;
193+
if (!size) return changetype<String>("");
194+
if (!fromPos && toPos == len << 1) return this;
195+
var out = __alloc(size, idof<String>());
196+
memory.copy(out, changetype<usize>(this) + fromPos, size);
197197
return changetype<String>(out); // retains
198198
}
199199

200200
trim(): String {
201-
var length = this.length;
202-
var size: usize = length << 1;
201+
var len = this.length;
202+
var size: usize = len << 1;
203203
while (size && isSpace(load<u16>(changetype<usize>(this) + size - 2))) {
204204
size -= 2;
205205
}
@@ -208,7 +208,7 @@ import { idof } from "./builtins";
208208
offset += 2; size -= 2;
209209
}
210210
if (!size) return changetype<String>("");
211-
if (!offset && size == length << 1) return this;
211+
if (!offset && size == len << 1) return this;
212212
var out = __alloc(size, idof<String>());
213213
memory.copy(out, changetype<usize>(this) + offset, size);
214214
return changetype<String>(out); // retains

tests/compiler/number.optimized.wat

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1360,6 +1360,7 @@
13601360
(func $~lib/string/String#substring (; 13 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32)
13611361
(local $2 i32)
13621362
(local $3 i32)
1363+
(local $4 i32)
13631364
i32.const 0
13641365
local.get $0
13651366
call $~lib/string/String#get:length
@@ -1381,54 +1382,51 @@
13811382
local.get $2
13821383
i32.lt_s
13831384
select
1384-
local.tee $2
1385+
local.tee $1
13851386
local.get $3
1386-
local.get $2
1387+
local.get $1
13871388
i32.gt_s
13881389
select
13891390
i32.const 1
13901391
i32.shl
1391-
local.tee $1
1392+
local.tee $4
13921393
local.get $3
1393-
local.get $2
1394+
local.get $1
13941395
local.get $3
1395-
local.get $2
1396+
local.get $1
13961397
i32.lt_s
13971398
select
13981399
i32.const 1
13991400
i32.shl
1400-
local.tee $3
1401+
local.tee $1
14011402
i32.sub
1402-
local.tee $2
1403+
local.tee $3
14031404
i32.eqz
14041405
if
14051406
i32.const 1288
14061407
return
14071408
end
1408-
local.get $3
1409-
if (result i32)
1410-
i32.const 0
1411-
else
1412-
local.get $0
1413-
call $~lib/string/String#get:length
1414-
i32.const 1
1415-
i32.shl
1416-
local.get $1
1417-
i32.eq
1418-
end
1409+
i32.const 0
1410+
local.get $2
1411+
i32.const 1
1412+
i32.shl
1413+
local.get $4
1414+
i32.eq
1415+
local.get $1
1416+
select
14191417
if
14201418
local.get $0
14211419
return
14221420
end
1423-
local.get $2
1421+
local.get $3
14241422
call $~lib/rt/stub/__alloc
1425-
local.tee $1
1423+
local.tee $2
14261424
local.get $0
1427-
local.get $3
1425+
local.get $1
14281426
i32.add
1429-
local.get $2
1427+
local.get $3
14301428
call $~lib/memory/memory.copy
1431-
local.get $1
1429+
local.get $2
14321430
)
14331431
(func $~lib/rt/stub/__free (; 14 ;) (type $FUNCSIG$vi) (param $0 i32)
14341432
(local $1 i32)

tests/compiler/number.untouched.wat

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3171,6 +3171,7 @@
31713171
(local $8 i32)
31723172
(local $9 i32)
31733173
(local $10 i32)
3174+
(local $11 i32)
31743175
local.get $0
31753176
call $~lib/string/String#get:length
31763177
local.set $3
@@ -3231,8 +3232,8 @@
32313232
local.get $9
32323233
local.get $8
32333234
i32.sub
3234-
local.set $3
3235-
local.get $3
3235+
local.set $10
3236+
local.get $10
32363237
i32.eqz
32373238
if
32383239
i32.const 1736
@@ -3243,8 +3244,7 @@
32433244
i32.eqz
32443245
if (result i32)
32453246
local.get $9
3246-
local.get $0
3247-
call $~lib/string/String#get:length
3247+
local.get $3
32483248
i32.const 1
32493249
i32.shl
32503250
i32.eq
@@ -3256,17 +3256,17 @@
32563256
call $~lib/rt/stub/__retain
32573257
return
32583258
end
3259-
local.get $3
3259+
local.get $10
32603260
i32.const 1
32613261
call $~lib/rt/stub/__alloc
3262-
local.set $10
3263-
local.get $10
3262+
local.set $11
3263+
local.get $11
32643264
local.get $0
32653265
local.get $8
32663266
i32.add
3267-
local.get $3
3268-
call $~lib/memory/memory.copy
32693267
local.get $10
3268+
call $~lib/memory/memory.copy
3269+
local.get $11
32703270
call $~lib/rt/stub/__retain
32713271
)
32723272
(func $~lib/rt/stub/__free (; 21 ;) (type $FUNCSIG$vi) (param $0 i32)

tests/compiler/resolve-binary.optimized.wat

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1546,6 +1546,7 @@
15461546
(func $~lib/string/String#substring (; 15 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32)
15471547
(local $2 i32)
15481548
(local $3 i32)
1549+
(local $4 i32)
15491550
i32.const 0
15501551
local.get $0
15511552
call $~lib/string/String#get:length
@@ -1567,55 +1568,52 @@
15671568
local.get $2
15681569
i32.lt_s
15691570
select
1570-
local.tee $2
1571+
local.tee $1
15711572
local.get $3
1572-
local.get $2
1573+
local.get $1
15731574
i32.gt_s
15741575
select
15751576
i32.const 1
15761577
i32.shl
1577-
local.tee $1
1578+
local.tee $4
15781579
local.get $3
1579-
local.get $2
1580+
local.get $1
15801581
local.get $3
1581-
local.get $2
1582+
local.get $1
15821583
i32.lt_s
15831584
select
15841585
i32.const 1
15851586
i32.shl
1586-
local.tee $3
1587+
local.tee $1
15871588
i32.sub
1588-
local.tee $2
1589+
local.tee $3
15891590
i32.eqz
15901591
if
15911592
i32.const 1408
15921593
return
15931594
end
1594-
local.get $3
1595-
if (result i32)
1596-
i32.const 0
1597-
else
1598-
local.get $0
1599-
call $~lib/string/String#get:length
1600-
i32.const 1
1601-
i32.shl
1602-
local.get $1
1603-
i32.eq
1604-
end
1595+
i32.const 0
1596+
local.get $2
1597+
i32.const 1
1598+
i32.shl
1599+
local.get $4
1600+
i32.eq
1601+
local.get $1
1602+
select
16051603
if
16061604
local.get $0
16071605
return
16081606
end
1609-
local.get $2
1607+
local.get $3
16101608
i32.const 1
16111609
call $~lib/rt/stub/__alloc
1612-
local.tee $1
1610+
local.tee $2
16131611
local.get $0
1614-
local.get $3
1612+
local.get $1
16151613
i32.add
1616-
local.get $2
1614+
local.get $3
16171615
call $~lib/memory/memory.copy
1618-
local.get $1
1616+
local.get $2
16191617
)
16201618
(func $~lib/rt/stub/__free (; 16 ;) (type $FUNCSIG$vi) (param $0 i32)
16211619
(local $1 i32)

tests/compiler/resolve-binary.untouched.wat

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4366,6 +4366,7 @@
43664366
(local $8 i32)
43674367
(local $9 i32)
43684368
(local $10 i32)
4369+
(local $11 i32)
43694370
local.get $0
43704371
call $~lib/string/String#get:length
43714372
local.set $3
@@ -4426,8 +4427,8 @@
44264427
local.get $9
44274428
local.get $8
44284429
i32.sub
4429-
local.set $3
4430-
local.get $3
4430+
local.set $10
4431+
local.get $10
44314432
i32.eqz
44324433
if
44334434
i32.const 1856
@@ -4438,8 +4439,7 @@
44384439
i32.eqz
44394440
if (result i32)
44404441
local.get $9
4441-
local.get $0
4442-
call $~lib/string/String#get:length
4442+
local.get $3
44434443
i32.const 1
44444444
i32.shl
44454445
i32.eq
@@ -4451,17 +4451,17 @@
44514451
call $~lib/rt/stub/__retain
44524452
return
44534453
end
4454-
local.get $3
4454+
local.get $10
44554455
i32.const 1
44564456
call $~lib/rt/stub/__alloc
4457-
local.set $10
4458-
local.get $10
4457+
local.set $11
4458+
local.get $11
44594459
local.get $0
44604460
local.get $8
44614461
i32.add
4462-
local.get $3
4463-
call $~lib/memory/memory.copy
44644462
local.get $10
4463+
call $~lib/memory/memory.copy
4464+
local.get $11
44654465
call $~lib/rt/stub/__retain
44664466
)
44674467
(func $~lib/rt/stub/__free (; 24 ;) (type $FUNCSIG$vi) (param $0 i32)

0 commit comments

Comments
 (0)