lower: 전역과 문자열 리터럴, 그리고 defer 실행 검증
전역은 정적 저장소다. 초기값이 컴파일타임 상수면 이미지에 박고 아니면 0이다. 문자열 리터럴은 바이트를 이미지에 두고 포인터와 길이를 값으로 만든다. 같은 글자는 같은 저장소를 쓴다 -- 읽기 전용이라 공유가 공짜다. defers 프로그램이 defer 순서를 실행으로 고정한다. 등록 역순이고, 이른 return 과 끝까지 간 경로 양쪽 다 돈다.
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
// EXIT:21921
|
||||
// body(true): defer 2 then defer 1 -> 2, 21
|
||||
// body(false): note(9) first -> 219, 2192, 21921
|
||||
unit defers;
|
||||
|
||||
var log: i32 = 0;
|
||||
|
||||
fn note(v: i32) -> void { log = log * 10 + v; }
|
||||
|
||||
fn body(early: bool) -> i32 {
|
||||
defer { note(1); }
|
||||
defer { note(2); }
|
||||
if early { return 0; }
|
||||
note(9);
|
||||
return 0;
|
||||
}
|
||||
|
||||
fn main() -> i32 {
|
||||
body(true);
|
||||
body(false);
|
||||
return log;
|
||||
}
|
||||
Reference in New Issue
Block a user