use super::super::*;
#[test]
fn eliminate_fallthrough_gotos_strips_goto_followed_by_label() {
let mut statements = vec![
"let x = 1;".to_string(),
"goto label_0x0010;".to_string(),
"label_0x0010:".to_string(),
"return x;".to_string(),
];
HighLevelEmitter::eliminate_fallthrough_gotos(&mut statements);
assert!(
statements[1].is_empty(),
"fallthrough goto should be cleared: {statements:?}"
);
assert_eq!(statements[2], "label_0x0010:");
}
#[test]
fn eliminate_fallthrough_gotos_strips_leave_followed_by_label() {
let mut statements = vec![
"try {".to_string(),
" leave label_0x0008;".to_string(),
" label_0x0008:".to_string(),
"}".to_string(),
"finally {".to_string(),
"}".to_string(),
];
HighLevelEmitter::eliminate_fallthrough_gotos(&mut statements);
assert!(
statements[1].is_empty(),
"fallthrough leave should be cleared: {statements:?}"
);
}
#[test]
fn eliminate_fallthrough_gotos_strips_leave_through_close_braces() {
let mut statements = vec![
"try {".to_string(),
"}".to_string(),
"catch {".to_string(),
" leave label_0x0009;".to_string(),
"}".to_string(),
"label_0x0009:".to_string(),
"return;".to_string(),
];
HighLevelEmitter::eliminate_fallthrough_gotos(&mut statements);
assert!(
statements[3].is_empty(),
"leave at end of catch body should be cleared when label sits past `}}`: {statements:?}"
);
}
#[test]
fn eliminate_fallthrough_gotos_keeps_leave_when_intervening_code_present() {
let mut statements = vec![
"catch {".to_string(),
" leave label_0x0010;".to_string(),
"}".to_string(),
"let x = 1;".to_string(),
"label_0x0010:".to_string(),
"return;".to_string(),
];
HighLevelEmitter::eliminate_fallthrough_gotos(&mut statements);
assert_eq!(
statements[1].trim(),
"leave label_0x0010;",
"leave with intervening code must be preserved: {statements:?}"
);
}
#[test]
fn eliminate_fallthrough_gotos_keeps_leave_when_target_is_distant() {
let mut statements = vec![
"leave label_0x0010;".to_string(),
"let unreachable = 1;".to_string(),
"label_0x0010:".to_string(),
"return;".to_string(),
];
HighLevelEmitter::eliminate_fallthrough_gotos(&mut statements);
assert_eq!(
statements[0], "leave label_0x0010;",
"non-fallthrough leave must be preserved: {statements:?}"
);
}