The r-prefixed waves absorb the runtime, reject, and byte-compare rows of the migrated native carriers; each fixture is one directory with one case.ww and a //ww:error, //ww:compile, //ww:run, or //ww:run-exit directive covering both frontends.
88 lines
3.1 KiB
Plaintext
88 lines
3.1 KiB
Plaintext
//ww:run
|
|
package main;
|
|
|
|
type s6 = struct { a: i64, b: i64, c: i64, d: i64, e: i64, f: i64 };
|
|
type cell = (s6 | bool);
|
|
type thread = struct { pc: i64, matched: bool };
|
|
|
|
fn i64_first() i32 = {
|
|
let xs: []i64 = []; append(xs, 7); append(xs, 11); append(xs, 13);
|
|
delete(xs[0]); return (xs[0] + xs[1]): i32 + len(xs)*10;
|
|
};
|
|
fn i64_middle() i32 = {
|
|
let xs: []i64 = []; append(xs, 7); append(xs, 11); append(xs, 13);
|
|
delete(xs[1]); return (xs[0] + xs[1]): i32 + len(xs)*10;
|
|
};
|
|
fn i64_last() i32 = {
|
|
let xs: []i64 = []; append(xs, 7); append(xs, 11); append(xs, 13);
|
|
delete(xs[2]); return (xs[0] + xs[1]): i32 + len(xs)*10;
|
|
};
|
|
fn i32_narrow() i32 = {
|
|
let xs: []i32 = []; append(xs, 4i32); append(xs, 9i32); append(xs, 2i32);
|
|
delete(xs[0]); return xs[0] + xs[1]*10 + len(xs)*100;
|
|
};
|
|
fn u16_narrow() i32 = {
|
|
let xs: []u16 = []; append(xs, 4u16); append(xs, 9u16); append(xs, 2u16);
|
|
delete(xs[1]); return (xs[0] + xs[1]): i32 + len(xs)*10;
|
|
};
|
|
fn u8_narrow() i32 = {
|
|
let xs: []u8 = []; append(xs, 5u8); append(xs, 9u8); append(xs, 3u8);
|
|
delete(xs[1]); return (xs[0] + xs[1]): i32 + len(xs)*10;
|
|
};
|
|
fn cap_unchanged() i32 = {
|
|
let hb: [8]u8; hb[0] = 4u8; hb[1] = 6u8; hb[2] = 9u8;
|
|
let xs: []u8; xs.ptr = &hb[0]; xs.len = 3; xs.cap = 8;
|
|
delete(xs[1]); return (xs.cap*10 + xs.len): i32 + xs[1]: i32;
|
|
};
|
|
fn delete_to_empty() i32 = {
|
|
let xs: []u8 = []; append(xs, 5u8); delete(xs[0]); return len(xs) + 7;
|
|
};
|
|
fn str_elem() i32 = {
|
|
let xs: []str = []; let a: str = "abc"; let b: str = "de"; let g: str = "fghi";
|
|
append(xs, a); append(xs, b); append(xs, g); delete(xs[1]);
|
|
return (xs[0].len*10 + xs[1].len): i32 + len(xs)*100;
|
|
};
|
|
fn tagged_56b() i32 = {
|
|
let xs: []cell = [];
|
|
let p0: s6 = s6 { a = 1, b = 2, c = 3, d = 4, e = 5, f = 6 };
|
|
let p1: s6 = s6 { a = 7, b = 8, c = 9, d = 10, e = 11, f = 12 };
|
|
let p2: s6 = s6 { a = 13, b = 14, c = 15, d = 16, e = 17, f = 18 };
|
|
append(xs, p0); append(xs, p1); append(xs, p2); delete(xs[1]);
|
|
let r: i32 = 0;
|
|
match (xs[1]) { case let s: s6 => r = s.a: i32; case bool => r = 99; };
|
|
let bp: *u8 = xs.ptr: *u8; r += bp[104]: i32;
|
|
return r + len(xs)*100;
|
|
};
|
|
fn delete_thread(i: i64, threads: *[]thread) void = { delete((*threads)[i]); };
|
|
fn regex_shape() i32 = {
|
|
let xs: []thread = [];
|
|
append(xs, thread { pc = 1, matched = false });
|
|
append(xs, thread { pc = 2, matched = false });
|
|
append(xs, thread { pc = 3, matched = false });
|
|
delete_thread(1, &xs);
|
|
let r: i32 = (xs[0].pc + xs[1].pc): i32;
|
|
return r + len(xs)*10;
|
|
};
|
|
fn delete_in_loop() i32 = {
|
|
let xs: []i64 = []; append(xs, 1); append(xs, 2); append(xs, 3); append(xs, 4);
|
|
let acc: i64 = 0;
|
|
for (len(xs) > 0) { acc = acc*4 + xs[0]; delete(xs[0]); };
|
|
return acc: i32 + len(xs)*1000;
|
|
};
|
|
|
|
export fn main() i32 = {
|
|
if (i64_first() != 44) { return 1; };
|
|
if (i64_middle() != 40) { return 2; };
|
|
if (i64_last() != 38) { return 3; };
|
|
if (i32_narrow() != 229) { return 4; };
|
|
if (u16_narrow() != 26) { return 5; };
|
|
if (u8_narrow() != 28) { return 6; };
|
|
if (cap_unchanged() != 91) { return 7; };
|
|
if (delete_to_empty() != 7) { return 8; };
|
|
if (str_elem() != 234) { return 9; };
|
|
if (tagged_56b() != 231) { return 10; };
|
|
if (regex_shape() != 24) { return 11; };
|
|
if (delete_in_loop() != 112) { return 12; };
|
|
return 0;
|
|
};
|