diff --git a/ts/fixtures/lang/elements/expected/spare.ts b/ts/fixtures/lang/elements/expected/spare.ts index 33f182bbe..58d456119 100644 --- a/ts/fixtures/lang/elements/expected/spare.ts +++ b/ts/fixtures/lang/elements/expected/spare.ts @@ -194,8 +194,8 @@ export function state$u32(v: rs.Vec, out: rs.ByteVec): void { */ export function pointers$Option_u16(data: rs.ByteSlice, out: rs.ByteVec): void { let _43!: rs.usize; - let _155!: rs.usize; - let _184!: rs.usize; + let _165!: rs.usize; + let _194!: rs.usize; const ops: Ops.Ops = { _0Data: data.data, _0Start: data.start, _0Len: data.length }; let v: rs.Vec = rs.vecWithCapacity(rs.u8Rem(Ops.byte(ops), 12) as rs.usize, 4); while (!(ops._0Len === 0)) { @@ -215,9 +215,14 @@ export function pointers$Option_u16(data: rs.ByteSlice, out: rs.ByteVec): void { const i: rs.usize = _43; rs.ptrAdd(end, i).v = of$spare_Item_Option_u16(rs.u8WrappingAdd(n, i & 0xff)); } + if (k >= 2) { + const _54: rs.Slice = new rs.RawSlice(end, k).array(2); + rs.sliceSwap(_54, 0, 1); + put$spare_Item_Option_u16(_54.data[_54.start], out); + } const moved: rs.Vec = rs.replaceIn(v, new rs.Vec()); - for (const _61 of rs.sliceItems(rs.ptrSlice(rs.ptrAdd(end, -len), rs.usizeAdd(len, k)))) { - put$spare_Item_Option_u16(_61, out); + for (const _71 of rs.sliceItems(rs.ptrSlice(rs.ptrAdd(end, -len), rs.usizeAdd(len, k)))) { + put$spare_Item_Option_u16(_71, out); } rs.vecSetLen(moved, rs.usizeAdd(len, k), 4, (): rs.u16 | undefined => { return (undefined as unknown) as rs.u16 | undefined; @@ -237,11 +242,11 @@ export function pointers$Option_u16(data: rs.ByteSlice, out: rs.ByteVec): void { if (_35 === 2) { const iter3: rs.Iter<[rs.usize, rs.Place]> = rs.iterRev(rs.iterEnumerate(rs.iterSliceMut(rs.ptrSlice(rs.ptrAdd(rs.vecAsPtr(v, 4), len), k)))); while (true) { - const _98: [rs.usize, rs.Place] | rs.Done = iter3.next(); - if (_98 === rs.DONE) { + const _108: [rs.usize, rs.Place] | rs.Done = iter3.next(); + if (_108 === rs.DONE) { break; } - _98[1].v = of$spare_Item_Option_u16(rs.u8WrappingSub(n, _98[0] & 0xff)); + _108[1].v = of$spare_Item_Option_u16(rs.u8WrappingSub(n, _108[0] & 0xff)); } rs.vecSetLen(v, rs.usizeAdd(len, k), 4, (): rs.u16 | undefined => { return (undefined as unknown) as rs.u16 | undefined; @@ -269,8 +274,8 @@ export function pointers$Option_u16(data: rs.ByteSlice, out: rs.ByteVec): void { const p2: rs.Place = rs.vecAsPtr(v, 4); let iterStart2: rs.usize = at2; const iterEnd2: rs.usize = end2; - while ((_155 = iterStart2++) < iterEnd2) { - put$spare_Item_Option_u16(rs.ptrAdd(p2, _155).v, out); + while ((_165 = iterStart2++) < iterEnd2) { + put$spare_Item_Option_u16(rs.ptrAdd(p2, _165).v, out); } rs.ptrCopy(rs.ptrAdd(p2, end2), rs.ptrAdd(p2, at2), rs.usizeSub(len, end2)); rs.vecSetLen(v, rs.usizeSub(len, rs.usizeSub(end2, at2)), 4, (): rs.u16 | undefined => { @@ -287,8 +292,8 @@ export function pointers$Option_u16(data: rs.ByteSlice, out: rs.ByteVec): void { let kept: rs.usize = 0; let iterStart3: rs.usize = 0; const iterEnd3: rs.usize = len; - while ((_184 = iterStart3++) < iterEnd3) { - const i4: rs.usize = _184; + while ((_194 = iterStart3++) < iterEnd3) { + const i4: rs.usize = _194; const x: rs.u16 | undefined = rs.ptrAdd(p3, i4).v; if (rs.usizeRem(rs.usizeAdd(i4, n as rs.usize), 3) !== 0) { rs.ptrAdd(p3, kept).v = x; @@ -321,8 +326,8 @@ export function pointers$Option_u16(data: rs.ByteSlice, out: rs.ByteVec): void { */ export function pointers$String(data: rs.ByteSlice, out: rs.ByteVec): void { let _43!: rs.usize; - let _155!: rs.usize; - let _184!: rs.usize; + let _165!: rs.usize; + let _194!: rs.usize; const ops: Ops.Ops = { _0Data: data.data, _0Start: data.start, _0Len: data.length }; let v: rs.Vec = rs.vecWithCapacity(rs.u8Rem(Ops.byte(ops), 12) as rs.usize, 12); while (!(ops._0Len === 0)) { @@ -342,9 +347,14 @@ export function pointers$String(data: rs.ByteSlice, out: rs.ByteVec): void { const i: rs.usize = _43; rs.ptrAdd(end, i).v = of$spare_Item_String(rs.u8WrappingAdd(n, i & 0xff)); } + if (k >= 2) { + const _54: rs.Slice = new rs.RawSlice(end, k).array(2); + rs.sliceSwap(_54, 0, 1); + put$spare_Item_String(_54.data[_54.start], out); + } const moved: rs.Vec = rs.replaceIn(v, new rs.Vec()); - for (const _61 of rs.sliceItems(rs.ptrSlice(rs.ptrAdd(end, -len), rs.usizeAdd(len, k)))) { - put$spare_Item_String(_61, out); + for (const _71 of rs.sliceItems(rs.ptrSlice(rs.ptrAdd(end, -len), rs.usizeAdd(len, k)))) { + put$spare_Item_String(_71, out); } rs.vecSetLen(moved, rs.usizeAdd(len, k), 12, (): rs.String => { return (undefined as unknown) as rs.String; @@ -364,11 +374,11 @@ export function pointers$String(data: rs.ByteSlice, out: rs.ByteVec): void { if (_35 === 2) { const iter3: rs.Iter<[rs.usize, rs.Place]> = rs.iterRev(rs.iterEnumerate(rs.iterSliceMut(rs.ptrSlice(rs.ptrAdd(rs.vecAsPtr(v, 12), len), k)))); while (true) { - const _98: [rs.usize, rs.Place] | rs.Done = iter3.next(); - if (_98 === rs.DONE) { + const _108: [rs.usize, rs.Place] | rs.Done = iter3.next(); + if (_108 === rs.DONE) { break; } - _98[1].v = of$spare_Item_String(rs.u8WrappingSub(n, _98[0] & 0xff)); + _108[1].v = of$spare_Item_String(rs.u8WrappingSub(n, _108[0] & 0xff)); } rs.vecSetLen(v, rs.usizeAdd(len, k), 12, (): rs.String => { return (undefined as unknown) as rs.String; @@ -396,8 +406,8 @@ export function pointers$String(data: rs.ByteSlice, out: rs.ByteVec): void { const p2: rs.Place = rs.vecAsPtr(v, 12); let iterStart2: rs.usize = at2; const iterEnd2: rs.usize = end2; - while ((_155 = iterStart2++) < iterEnd2) { - put$spare_Item_String(rs.ptrAdd(p2, _155).v, out); + while ((_165 = iterStart2++) < iterEnd2) { + put$spare_Item_String(rs.ptrAdd(p2, _165).v, out); } rs.ptrCopy(rs.ptrAdd(p2, end2), rs.ptrAdd(p2, at2), rs.usizeSub(len, end2)); rs.vecSetLen(v, rs.usizeSub(len, rs.usizeSub(end2, at2)), 12, (): rs.String => { @@ -414,8 +424,8 @@ export function pointers$String(data: rs.ByteSlice, out: rs.ByteVec): void { let kept: rs.usize = 0; let iterStart3: rs.usize = 0; const iterEnd3: rs.usize = len; - while ((_184 = iterStart3++) < iterEnd3) { - const i4: rs.usize = _184; + while ((_194 = iterStart3++) < iterEnd3) { + const i4: rs.usize = _194; const x: rs.String = rs.ptrAdd(p3, i4).v; if (rs.usizeRem(rs.usizeAdd(i4, n as rs.usize), 3) !== 0) { rs.ptrAdd(p3, kept).v = x; @@ -448,8 +458,8 @@ export function pointers$String(data: rs.ByteSlice, out: rs.ByteVec): void { */ export function pointers$u32(data: rs.ByteSlice, out: rs.ByteVec): void { let _43!: rs.usize; - let _155!: rs.usize; - let _184!: rs.usize; + let _165!: rs.usize; + let _194!: rs.usize; const ops: Ops.Ops = { _0Data: data.data, _0Start: data.start, _0Len: data.length }; let v: rs.Vec = rs.vecWithCapacity(rs.u8Rem(Ops.byte(ops), 12) as rs.usize, 4); while (!(ops._0Len === 0)) { @@ -469,9 +479,14 @@ export function pointers$u32(data: rs.ByteSlice, out: rs.ByteVec): void { const i: rs.usize = _43; rs.ptrAdd(end, i).v = of$spare_Item_u32(rs.u8WrappingAdd(n, i & 0xff)); } + if (k >= 2) { + const _54: rs.Slice = new rs.RawSlice(end, k).array(2); + rs.sliceSwap(_54, 0, 1); + put$spare_Item_u32(_54.data[_54.start], out); + } const moved: rs.Vec = rs.replaceIn(v, new rs.Vec()); - for (const _61 of rs.sliceItems(rs.ptrSlice(rs.ptrAdd(end, -len), rs.usizeAdd(len, k)))) { - put$spare_Item_u32(_61, out); + for (const _71 of rs.sliceItems(rs.ptrSlice(rs.ptrAdd(end, -len), rs.usizeAdd(len, k)))) { + put$spare_Item_u32(_71, out); } rs.vecSetLen(moved, rs.usizeAdd(len, k), 4, (): rs.u32 => { return (undefined as unknown) as rs.u32; @@ -491,11 +506,11 @@ export function pointers$u32(data: rs.ByteSlice, out: rs.ByteVec): void { if (_35 === 2) { const iter3: rs.Iter<[rs.usize, rs.Place]> = rs.iterRev(rs.iterEnumerate(rs.iterSliceMut(rs.ptrSlice(rs.ptrAdd(rs.vecAsPtr(v, 4), len), k)))); while (true) { - const _98: [rs.usize, rs.Place] | rs.Done = iter3.next(); - if (_98 === rs.DONE) { + const _108: [rs.usize, rs.Place] | rs.Done = iter3.next(); + if (_108 === rs.DONE) { break; } - _98[1].v = of$spare_Item_u32(rs.u8WrappingSub(n, _98[0] & 0xff)); + _108[1].v = of$spare_Item_u32(rs.u8WrappingSub(n, _108[0] & 0xff)); } rs.vecSetLen(v, rs.usizeAdd(len, k), 4, (): rs.u32 => { return (undefined as unknown) as rs.u32; @@ -523,8 +538,8 @@ export function pointers$u32(data: rs.ByteSlice, out: rs.ByteVec): void { const p2: rs.Place = rs.vecAsPtr(v, 4); let iterStart2: rs.usize = at2; const iterEnd2: rs.usize = end2; - while ((_155 = iterStart2++) < iterEnd2) { - put$spare_Item_u32(rs.ptrAdd(p2, _155).v, out); + while ((_165 = iterStart2++) < iterEnd2) { + put$spare_Item_u32(rs.ptrAdd(p2, _165).v, out); } rs.ptrCopy(rs.ptrAdd(p2, end2), rs.ptrAdd(p2, at2), rs.usizeSub(len, end2)); rs.vecSetLen(v, rs.usizeSub(len, rs.usizeSub(end2, at2)), 4, (): rs.u32 => { @@ -541,8 +556,8 @@ export function pointers$u32(data: rs.ByteSlice, out: rs.ByteVec): void { let kept: rs.usize = 0; let iterStart3: rs.usize = 0; const iterEnd3: rs.usize = len; - while ((_184 = iterStart3++) < iterEnd3) { - const i4: rs.usize = _184; + while ((_194 = iterStart3++) < iterEnd3) { + const i4: rs.usize = _194; const x: rs.u32 = rs.ptrAdd(p3, i4).v; if (rs.usizeRem(rs.usizeAdd(i4, n as rs.usize), 3) !== 0) { rs.ptrAdd(p3, kept).v = x; diff --git a/ts/fixtures/lang/elements/src/spare.rs b/ts/fixtures/lang/elements/src/spare.rs index 415b267d0..3faaf2765 100644 --- a/ts/fixtures/lang/elements/src/spare.rs +++ b/ts/fixtures/lang/elements/src/spare.rs @@ -145,6 +145,12 @@ fn pointers(data: &[u8], out: &mut Vec) { for i in 0..k { end.add(i).write(T::of(n.wrapping_add(i as u8))); } + // The room's raw slice cast to an array, read and written through. + if k >= 2 { + let pair = &mut *(ptr::slice_from_raw_parts_mut(end, k) as *mut [T; 2]); + pair.swap(0, 1); + pair[0].put(out); + } // Moved to another binding and back, which keeps its storage, read through // the pointer from before the move. let mut moved = std::mem::take(&mut v); diff --git a/ts/runtime/rs.ts b/ts/runtime/rs.ts index d79abee94..e1f77d1f2 100644 --- a/ts/runtime/rs.ts +++ b/ts/runtime/rs.ts @@ -517,7 +517,7 @@ export class RawSlice { array(n: number): Slice { if (ptrNowhere(this.ptr)) return this.ptr as never; const at = elemOf(this.ptr); - return new Slice(at.array as T[], at.index, n); + return new Slice(sliceArray(at, n), at.index, n); } /**