diff --git a/std/assembly/array.ts b/std/assembly/array.ts index 59abb3c9..059d5650 100644 --- a/std/assembly/array.ts +++ b/std/assembly/array.ts @@ -344,7 +344,7 @@ export class Array { var len = this.length_; begin = begin < 0 ? max(begin + len, 0) : min(begin, len); end = end < 0 ? max(end + len, 0) : min(end, len); - len = end - begin; + len = max(end - begin, 0); var sliced = new Array(len); if (len) { memory.copy( diff --git a/std/assembly/arraybuffer.ts b/std/assembly/arraybuffer.ts index bef14bdb..9014d73b 100644 --- a/std/assembly/arraybuffer.ts +++ b/std/assembly/arraybuffer.ts @@ -52,13 +52,15 @@ export class ArrayBuffer { slice(begin: i32 = 0, end: i32 = MAX_BLENGTH): ArrayBuffer { var len = this.byteLength; - if (begin < 0) begin = max(len + begin, 0); - else begin = min(begin, len); - if (end < 0) end = max(len + end, 0); - else end = min(end, len); - var newLen = max(end - begin, 0); - var buffer = allocateUnsafe(newLen); - memory.copy(changetype(buffer) + HEADER_SIZE, changetype(this) + HEADER_SIZE + begin, newLen); + begin = begin < 0 ? max(len + begin, 0) : min(begin, len); + end = end < 0 ? max(len + end, 0) : min(end, len); + len = max(end - begin, 0); + var buffer = allocateUnsafe(len); + memory.copy( + changetype(buffer) + HEADER_SIZE, + changetype(this) + HEADER_SIZE + begin, + len + ); return buffer; } diff --git a/std/assembly/string.ts b/std/assembly/string.ts index 70a8527a..b6ca9f73 100644 --- a/std/assembly/string.ts +++ b/std/assembly/string.ts @@ -394,10 +394,10 @@ export class String { } slice(beginIndex: i32, endIndex: i32 = i32.MAX_VALUE): String { - var length = this.length; - var begin = (beginIndex < 0) ? max(beginIndex + length, 0) : min(beginIndex, length); - var end = (endIndex < 0) ? max(endIndex + length, 0) : min(endIndex, length); - var len = end - begin; + var len = this.length; + var begin = beginIndex < 0 ? max(beginIndex + len, 0) : min(beginIndex, len); + var end = endIndex < 0 ? max(endIndex + len, 0) : min(endIndex, len); + len = end - begin; if (len <= 0) return changetype(""); var out = allocateUnsafe(len); copyUnsafe(out, 0, this, begin, len); diff --git a/tests/compiler/std/arraybuffer.optimized.wat b/tests/compiler/std/arraybuffer.optimized.wat index 67e77e99..1aa4cf2d 100644 --- a/tests/compiler/std/arraybuffer.optimized.wat +++ b/tests/compiler/std/arraybuffer.optimized.wat @@ -1437,26 +1437,25 @@ (local $4 i32) local.get $0 i32.load - local.set $4 + local.set $3 local.get $1 i32.const 0 i32.lt_s if (result i32) local.get $1 - local.get $4 - i32.add - local.tee $3 - i32.const 0 local.get $3 + i32.add + local.tee $4 + i32.const 0 + local.get $4 i32.const 0 i32.gt_s select else local.get $1 - local.tee $3 - local.get $4 local.get $3 - local.get $4 + local.get $1 + local.get $3 i32.lt_s select end @@ -1466,28 +1465,27 @@ i32.lt_s if (result i32) local.get $2 - local.get $4 - i32.add - local.tee $3 - i32.const 0 local.get $3 + i32.add + local.tee $4 + i32.const 0 + local.get $4 i32.const 0 i32.gt_s select else local.get $2 - local.tee $3 - local.get $4 local.get $3 - local.get $4 + local.get $2 + local.get $3 i32.lt_s select end local.get $1 i32.sub - local.tee $3 + local.tee $4 i32.const 0 - local.get $3 + local.get $4 i32.const 0 i32.gt_s select diff --git a/tests/compiler/std/arraybuffer.untouched.wat b/tests/compiler/std/arraybuffer.untouched.wat index 5429c26b..840b04b8 100644 --- a/tests/compiler/std/arraybuffer.untouched.wat +++ b/tests/compiler/std/arraybuffer.untouched.wat @@ -1887,14 +1887,13 @@ (local $5 i32) (local $6 i32) (local $7 i32) - (local $8 i32) local.get $0 i32.load local.set $3 local.get $1 i32.const 0 i32.lt_s - if + if (result i32) local.get $3 local.get $1 i32.add @@ -1905,7 +1904,6 @@ local.get $5 i32.gt_s select - local.set $1 else local.get $1 local.tee $4 @@ -1915,12 +1913,12 @@ local.get $5 i32.lt_s select - local.set $1 end + local.set $1 local.get $2 i32.const 0 i32.lt_s - if + if (result i32) local.get $3 local.get $2 i32.add @@ -1931,7 +1929,6 @@ local.get $5 i32.gt_s select - local.set $2 else local.get $2 local.tee $4 @@ -1941,8 +1938,8 @@ local.get $5 i32.lt_s select - local.set $2 end + local.set $2 local.get $2 local.get $1 i32.sub @@ -1953,12 +1950,12 @@ local.get $5 i32.gt_s select - local.set $6 - local.get $6 + local.set $3 + local.get $3 call $~lib/internal/arraybuffer/allocateUnsafe - local.set $7 + local.set $6 block $~lib/memory/memory.copy|inlined.0 - local.get $7 + local.get $6 i32.const 8 i32.add local.set $4 @@ -1968,14 +1965,14 @@ local.get $1 i32.add local.set $5 - local.get $6 - local.set $8 + local.get $3 + local.set $7 local.get $4 local.get $5 - local.get $8 + local.get $7 call $~lib/internal/memory/memmove 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) block $2of2 diff --git a/tests/compiler/std/string.optimized.wat b/tests/compiler/std/string.optimized.wat index ba824890..3760dc99 100644 --- a/tests/compiler/std/string.optimized.wat +++ b/tests/compiler/std/string.optimized.wat @@ -2988,20 +2988,20 @@ end local.get $4 i32.sub - local.tee $2 + local.tee $3 i32.const 0 i32.le_s if i32.const 256 return end - local.get $2 + local.get $3 call $~lib/internal/string/allocateUnsafe local.tee $1 i32.const 0 local.get $0 local.get $4 - local.get $2 + local.get $3 call $~lib/internal/string/copyUnsafe local.get $1 ) diff --git a/tests/compiler/std/string.untouched.wat b/tests/compiler/std/string.untouched.wat index b2192b8f..184cd0ca 100644 --- a/tests/compiler/std/string.untouched.wat +++ b/tests/compiler/std/string.untouched.wat @@ -3659,7 +3659,6 @@ (local $6 i32) (local $7 i32) (local $8 i32) - (local $9 i32) local.get $0 i32.load local.set $3 @@ -3716,24 +3715,24 @@ local.get $7 local.get $6 i32.sub - local.set $8 - local.get $8 + local.set $3 + local.get $3 i32.const 0 i32.le_s if i32.const 256 return end - local.get $8 + local.get $3 call $~lib/internal/string/allocateUnsafe - local.set $9 - local.get $9 + local.set $8 + local.get $8 i32.const 0 local.get $0 local.get $6 - local.get $8 + local.get $3 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) block $1of1