Skip to content

Commit cdf4057

Browse files
MaxGraeydcodeIO
authored andcommitted
Refactor slices for better compliance (AssemblyScript#430)
1 parent aad263e commit cdf4057

File tree

7 files changed

+49
-53
lines changed

7 files changed

+49
-53
lines changed

std/assembly/array.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ export class Array<T> {
344344
var len = this.length_;
345345
begin = begin < 0 ? max(begin + len, 0) : min(begin, len);
346346
end = end < 0 ? max(end + len, 0) : min(end, len);
347-
len = end - begin;
347+
len = max(end - begin, 0);
348348
var sliced = new Array<T>(len);
349349
if (len) {
350350
memory.copy(

std/assembly/arraybuffer.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,15 @@ export class ArrayBuffer {
5252

5353
slice(begin: i32 = 0, end: i32 = MAX_BLENGTH): ArrayBuffer {
5454
var len = this.byteLength;
55-
if (begin < 0) begin = max(len + begin, 0);
56-
else begin = min(begin, len);
57-
if (end < 0) end = max(len + end, 0);
58-
else end = min(end, len);
59-
var newLen = max(end - begin, 0);
60-
var buffer = allocateUnsafe(newLen);
61-
memory.copy(changetype<usize>(buffer) + HEADER_SIZE, changetype<usize>(this) + HEADER_SIZE + begin, newLen);
55+
begin = begin < 0 ? max(len + begin, 0) : min(begin, len);
56+
end = end < 0 ? max(len + end, 0) : min(end, len);
57+
len = max(end - begin, 0);
58+
var buffer = allocateUnsafe(len);
59+
memory.copy(
60+
changetype<usize>(buffer) + HEADER_SIZE,
61+
changetype<usize>(this) + HEADER_SIZE + begin,
62+
len
63+
);
6264
return buffer;
6365
}
6466

std/assembly/string.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -394,10 +394,10 @@ export class String {
394394
}
395395

396396
slice(beginIndex: i32, endIndex: i32 = i32.MAX_VALUE): String {
397-
var length = this.length;
398-
var begin = (beginIndex < 0) ? max(beginIndex + length, 0) : min(beginIndex, length);
399-
var end = (endIndex < 0) ? max(endIndex + length, 0) : min(endIndex, length);
400-
var len = end - begin;
397+
var len = this.length;
398+
var begin = beginIndex < 0 ? max(beginIndex + len, 0) : min(beginIndex, len);
399+
var end = endIndex < 0 ? max(endIndex + len, 0) : min(endIndex, len);
400+
len = end - begin;
401401
if (len <= 0) return changetype<String>("");
402402
var out = allocateUnsafe(len);
403403
copyUnsafe(out, 0, this, begin, len);

tests/compiler/std/arraybuffer.optimized.wat

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,26 +1437,25 @@
14371437
(local $4 i32)
14381438
local.get $0
14391439
i32.load
1440-
local.set $4
1440+
local.set $3
14411441
local.get $1
14421442
i32.const 0
14431443
i32.lt_s
14441444
if (result i32)
14451445
local.get $1
1446-
local.get $4
1446+
local.get $3
14471447
i32.add
1448-
local.tee $3
1448+
local.tee $4
14491449
i32.const 0
1450-
local.get $3
1450+
local.get $4
14511451
i32.const 0
14521452
i32.gt_s
14531453
select
14541454
else
14551455
local.get $1
1456-
local.tee $3
1457-
local.get $4
14581456
local.get $3
1459-
local.get $4
1457+
local.get $1
1458+
local.get $3
14601459
i32.lt_s
14611460
select
14621461
end
@@ -1466,28 +1465,27 @@
14661465
i32.lt_s
14671466
if (result i32)
14681467
local.get $2
1469-
local.get $4
1468+
local.get $3
14701469
i32.add
1471-
local.tee $3
1470+
local.tee $4
14721471
i32.const 0
1473-
local.get $3
1472+
local.get $4
14741473
i32.const 0
14751474
i32.gt_s
14761475
select
14771476
else
14781477
local.get $2
1479-
local.tee $3
1480-
local.get $4
14811478
local.get $3
1482-
local.get $4
1479+
local.get $2
1480+
local.get $3
14831481
i32.lt_s
14841482
select
14851483
end
14861484
local.get $1
14871485
i32.sub
1488-
local.tee $3
1486+
local.tee $4
14891487
i32.const 0
1490-
local.get $3
1488+
local.get $4
14911489
i32.const 0
14921490
i32.gt_s
14931491
select

tests/compiler/std/arraybuffer.untouched.wat

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1887,14 +1887,13 @@
18871887
(local $5 i32)
18881888
(local $6 i32)
18891889
(local $7 i32)
1890-
(local $8 i32)
18911890
local.get $0
18921891
i32.load
18931892
local.set $3
18941893
local.get $1
18951894
i32.const 0
18961895
i32.lt_s
1897-
if
1896+
if (result i32)
18981897
local.get $3
18991898
local.get $1
19001899
i32.add
@@ -1905,7 +1904,6 @@
19051904
local.get $5
19061905
i32.gt_s
19071906
select
1908-
local.set $1
19091907
else
19101908
local.get $1
19111909
local.tee $4
@@ -1915,12 +1913,12 @@
19151913
local.get $5
19161914
i32.lt_s
19171915
select
1918-
local.set $1
19191916
end
1917+
local.set $1
19201918
local.get $2
19211919
i32.const 0
19221920
i32.lt_s
1923-
if
1921+
if (result i32)
19241922
local.get $3
19251923
local.get $2
19261924
i32.add
@@ -1931,7 +1929,6 @@
19311929
local.get $5
19321930
i32.gt_s
19331931
select
1934-
local.set $2
19351932
else
19361933
local.get $2
19371934
local.tee $4
@@ -1941,8 +1938,8 @@
19411938
local.get $5
19421939
i32.lt_s
19431940
select
1944-
local.set $2
19451941
end
1942+
local.set $2
19461943
local.get $2
19471944
local.get $1
19481945
i32.sub
@@ -1953,12 +1950,12 @@
19531950
local.get $5
19541951
i32.gt_s
19551952
select
1956-
local.set $6
1957-
local.get $6
1953+
local.set $3
1954+
local.get $3
19581955
call $~lib/internal/arraybuffer/allocateUnsafe
1959-
local.set $7
1956+
local.set $6
19601957
block $~lib/memory/memory.copy|inlined.0
1961-
local.get $7
1958+
local.get $6
19621959
i32.const 8
19631960
i32.add
19641961
local.set $4
@@ -1968,14 +1965,14 @@
19681965
local.get $1
19691966
i32.add
19701967
local.set $5
1971-
local.get $6
1972-
local.set $8
1968+
local.get $3
1969+
local.set $7
19731970
local.get $4
19741971
local.get $5
1975-
local.get $8
1972+
local.get $7
19761973
call $~lib/internal/memory/memmove
19771974
end
1978-
local.get $7
1975+
local.get $6
19791976
)
19801977
(func $~lib/arraybuffer/ArrayBuffer#slice|trampoline (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
19811978
block $2of2

tests/compiler/std/string.optimized.wat

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2988,20 +2988,20 @@
29882988
end
29892989
local.get $4
29902990
i32.sub
2991-
local.tee $2
2991+
local.tee $3
29922992
i32.const 0
29932993
i32.le_s
29942994
if
29952995
i32.const 256
29962996
return
29972997
end
2998-
local.get $2
2998+
local.get $3
29992999
call $~lib/internal/string/allocateUnsafe
30003000
local.tee $1
30013001
i32.const 0
30023002
local.get $0
30033003
local.get $4
3004-
local.get $2
3004+
local.get $3
30053005
call $~lib/internal/string/copyUnsafe
30063006
local.get $1
30073007
)

tests/compiler/std/string.untouched.wat

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3659,7 +3659,6 @@
36593659
(local $6 i32)
36603660
(local $7 i32)
36613661
(local $8 i32)
3662-
(local $9 i32)
36633662
local.get $0
36643663
i32.load
36653664
local.set $3
@@ -3716,24 +3715,24 @@
37163715
local.get $7
37173716
local.get $6
37183717
i32.sub
3719-
local.set $8
3720-
local.get $8
3718+
local.set $3
3719+
local.get $3
37213720
i32.const 0
37223721
i32.le_s
37233722
if
37243723
i32.const 256
37253724
return
37263725
end
3727-
local.get $8
3726+
local.get $3
37283727
call $~lib/internal/string/allocateUnsafe
3729-
local.set $9
3730-
local.get $9
3728+
local.set $8
3729+
local.get $8
37313730
i32.const 0
37323731
local.get $0
37333732
local.get $6
3734-
local.get $8
3733+
local.get $3
37353734
call $~lib/internal/string/copyUnsafe
3736-
local.get $9
3735+
local.get $8
37373736
)
37383737
(func $~lib/string/String#slice|trampoline (; 35 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
37393738
block $1of1

0 commit comments

Comments
 (0)