Refactor slices for better compliance (#430)

This commit is contained in:
Max Graey 2019-02-27 22:51:07 +02:00 committed by Daniel Wirtz
parent aad263e670
commit cdf40578b6
7 changed files with 51 additions and 55 deletions

View File

@ -344,7 +344,7 @@ export class Array<T> {
var len = this.length_; var len = this.length_;
begin = begin < 0 ? max(begin + len, 0) : min(begin, len); begin = begin < 0 ? max(begin + len, 0) : min(begin, len);
end = end < 0 ? max(end + len, 0) : min(end, len); end = end < 0 ? max(end + len, 0) : min(end, len);
len = end - begin; len = max(end - begin, 0);
var sliced = new Array<T>(len); var sliced = new Array<T>(len);
if (len) { if (len) {
memory.copy( memory.copy(

View File

@ -52,13 +52,15 @@ export class ArrayBuffer {
slice(begin: i32 = 0, end: i32 = MAX_BLENGTH): ArrayBuffer { slice(begin: i32 = 0, end: i32 = MAX_BLENGTH): ArrayBuffer {
var len = this.byteLength; var len = this.byteLength;
if (begin < 0) begin = max(len + begin, 0); begin = begin < 0 ? max(len + begin, 0) : min(begin, len);
else begin = min(begin, len); end = end < 0 ? max(len + end, 0) : min(end, len);
if (end < 0) end = max(len + end, 0); len = max(end - begin, 0);
else end = min(end, len); var buffer = allocateUnsafe(len);
var newLen = max(end - begin, 0); memory.copy(
var buffer = allocateUnsafe(newLen); changetype<usize>(buffer) + HEADER_SIZE,
memory.copy(changetype<usize>(buffer) + HEADER_SIZE, changetype<usize>(this) + HEADER_SIZE + begin, newLen); changetype<usize>(this) + HEADER_SIZE + begin,
len
);
return buffer; return buffer;
} }

View File

@ -394,10 +394,10 @@ export class String {
} }
slice(beginIndex: i32, endIndex: i32 = i32.MAX_VALUE): String { slice(beginIndex: i32, endIndex: i32 = i32.MAX_VALUE): String {
var length = this.length; var len = this.length;
var begin = (beginIndex < 0) ? max(beginIndex + length, 0) : min(beginIndex, length); var begin = beginIndex < 0 ? max(beginIndex + len, 0) : min(beginIndex, len);
var end = (endIndex < 0) ? max(endIndex + length, 0) : min(endIndex, length); var end = endIndex < 0 ? max(endIndex + len, 0) : min(endIndex, len);
var len = end - begin; len = end - begin;
if (len <= 0) return changetype<String>(""); if (len <= 0) return changetype<String>("");
var out = allocateUnsafe(len); var out = allocateUnsafe(len);
copyUnsafe(out, 0, this, begin, len); copyUnsafe(out, 0, this, begin, len);

View File

@ -1437,26 +1437,25 @@
(local $4 i32) (local $4 i32)
local.get $0 local.get $0
i32.load i32.load
local.set $4 local.set $3
local.get $1 local.get $1
i32.const 0 i32.const 0
i32.lt_s i32.lt_s
if (result i32) if (result i32)
local.get $1 local.get $1
local.get $4
i32.add
local.tee $3
i32.const 0
local.get $3 local.get $3
i32.add
local.tee $4
i32.const 0
local.get $4
i32.const 0 i32.const 0
i32.gt_s i32.gt_s
select select
else else
local.get $1 local.get $1
local.tee $3
local.get $4
local.get $3 local.get $3
local.get $4 local.get $1
local.get $3
i32.lt_s i32.lt_s
select select
end end
@ -1466,28 +1465,27 @@
i32.lt_s i32.lt_s
if (result i32) if (result i32)
local.get $2 local.get $2
local.get $4
i32.add
local.tee $3
i32.const 0
local.get $3 local.get $3
i32.add
local.tee $4
i32.const 0
local.get $4
i32.const 0 i32.const 0
i32.gt_s i32.gt_s
select select
else else
local.get $2 local.get $2
local.tee $3
local.get $4
local.get $3 local.get $3
local.get $4 local.get $2
local.get $3
i32.lt_s i32.lt_s
select select
end end
local.get $1 local.get $1
i32.sub i32.sub
local.tee $3 local.tee $4
i32.const 0 i32.const 0
local.get $3 local.get $4
i32.const 0 i32.const 0
i32.gt_s i32.gt_s
select select

View File

@ -1887,14 +1887,13 @@
(local $5 i32) (local $5 i32)
(local $6 i32) (local $6 i32)
(local $7 i32) (local $7 i32)
(local $8 i32)
local.get $0 local.get $0
i32.load i32.load
local.set $3 local.set $3
local.get $1 local.get $1
i32.const 0 i32.const 0
i32.lt_s i32.lt_s
if if (result i32)
local.get $3 local.get $3
local.get $1 local.get $1
i32.add i32.add
@ -1905,7 +1904,6 @@
local.get $5 local.get $5
i32.gt_s i32.gt_s
select select
local.set $1
else else
local.get $1 local.get $1
local.tee $4 local.tee $4
@ -1915,12 +1913,12 @@
local.get $5 local.get $5
i32.lt_s i32.lt_s
select select
local.set $1
end end
local.set $1
local.get $2 local.get $2
i32.const 0 i32.const 0
i32.lt_s i32.lt_s
if if (result i32)
local.get $3 local.get $3
local.get $2 local.get $2
i32.add i32.add
@ -1931,7 +1929,6 @@
local.get $5 local.get $5
i32.gt_s i32.gt_s
select select
local.set $2
else else
local.get $2 local.get $2
local.tee $4 local.tee $4
@ -1941,8 +1938,8 @@
local.get $5 local.get $5
i32.lt_s i32.lt_s
select select
local.set $2
end end
local.set $2
local.get $2 local.get $2
local.get $1 local.get $1
i32.sub i32.sub
@ -1953,12 +1950,12 @@
local.get $5 local.get $5
i32.gt_s i32.gt_s
select select
local.set $6 local.set $3
local.get $6 local.get $3
call $~lib/internal/arraybuffer/allocateUnsafe call $~lib/internal/arraybuffer/allocateUnsafe
local.set $7 local.set $6
block $~lib/memory/memory.copy|inlined.0 block $~lib/memory/memory.copy|inlined.0
local.get $7 local.get $6
i32.const 8 i32.const 8
i32.add i32.add
local.set $4 local.set $4
@ -1968,14 +1965,14 @@
local.get $1 local.get $1
i32.add i32.add
local.set $5 local.set $5
local.get $6 local.get $3
local.set $8 local.set $7
local.get $4 local.get $4
local.get $5 local.get $5
local.get $8 local.get $7
call $~lib/internal/memory/memmove call $~lib/internal/memory/memmove
end end
local.get $7 local.get $6
) )
(func $~lib/arraybuffer/ArrayBuffer#slice|trampoline (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/arraybuffer/ArrayBuffer#slice|trampoline (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
block $2of2 block $2of2

View File

@ -2988,20 +2988,20 @@
end end
local.get $4 local.get $4
i32.sub i32.sub
local.tee $2 local.tee $3
i32.const 0 i32.const 0
i32.le_s i32.le_s
if if
i32.const 256 i32.const 256
return return
end end
local.get $2 local.get $3
call $~lib/internal/string/allocateUnsafe call $~lib/internal/string/allocateUnsafe
local.tee $1 local.tee $1
i32.const 0 i32.const 0
local.get $0 local.get $0
local.get $4 local.get $4
local.get $2 local.get $3
call $~lib/internal/string/copyUnsafe call $~lib/internal/string/copyUnsafe
local.get $1 local.get $1
) )

View File

@ -3659,7 +3659,6 @@
(local $6 i32) (local $6 i32)
(local $7 i32) (local $7 i32)
(local $8 i32) (local $8 i32)
(local $9 i32)
local.get $0 local.get $0
i32.load i32.load
local.set $3 local.set $3
@ -3716,24 +3715,24 @@
local.get $7 local.get $7
local.get $6 local.get $6
i32.sub i32.sub
local.set $8 local.set $3
local.get $8 local.get $3
i32.const 0 i32.const 0
i32.le_s i32.le_s
if if
i32.const 256 i32.const 256
return return
end end
local.get $8 local.get $3
call $~lib/internal/string/allocateUnsafe call $~lib/internal/string/allocateUnsafe
local.set $9 local.set $8
local.get $9 local.get $8
i32.const 0 i32.const 0
local.get $0 local.get $0
local.get $6 local.get $6
local.get $8 local.get $3
call $~lib/internal/string/copyUnsafe call $~lib/internal/string/copyUnsafe
local.get $9 local.get $8
) )
(func $~lib/string/String#slice|trampoline (; 35 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#slice|trampoline (; 35 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
block $1of1 block $1of1