@setEvalBranchQuota — 컴파일 타임 실행의 역분기 한도를 직접 올려주는 내장 함수
@setEvalBranchQuota — 컴파일 타임 실행의 역분기 한도를 직접 올려주는 내장 함수
본문
컴파일 타임 코드를 돌리다 보면, 포기하고 컴파일 에러를 내기 전까지 실행이 얼마나 많은 뒤로 가는 분기(backwards branch) 를 쓸 수 있는지에 상한이 있어요. 이 기본 상한이 1000인데, 루프 같은 걸 충분히 많이 돌리는 comptime 블록이라면 이 한도에 금방 부딪힐 수 있죠. 바로 그때 쓰는 내장 함수가 @setEvalBranchQuota예요.
@setEvalBranchQuota(comptime new_quota: u32) void
이 함수는 컴파일 타임 코드 실행이 포기하고 컴파일 에러를 내기 전까지 사용할 수 있는 뒤로 가는 분기의 최대 개수를 늘려줍니다.
한 가지 주의할 점이 있어요. new_quota가 기본 할당량(1000)이나 이전에 명시적으로 설정해 둔 할당량보다 작으면 무시됩니다. 즉, 할당량은 단방향으로만 올릴 수 있어요. 다시 낮추고 싶어도 이미 설정된 값보다 작은 값은 먹지 않는 거죠.
예시를 볼게요. 먼저 @setEvalBranchQuota를 쓰지 않은 경우예요.
test "foo" {
comptime {
var i = 0;
while (i < 1001) : (i += 1) {}
}
}
이 테스트를 돌리면 기본 한도 1000을 넘겨서 컴파일 에러가 나요.
$ zig test test_without_setEvalBranchQuota_builtin.zig
.../test_without_setEvalBranchQuota_builtin.zig:4:9: error: evaluation exceeded 1000 backwards branches
while (i < 1001) : (i += 1) {}
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.../test_without_setEvalBranchQuota_builtin.zig:4:9: note: use @setEvalBranchQuota() to raise the branch limit from 1000
이제 여기서 @setEvalBranchQuota를 써볼게요.
test "foo" {
comptime {
@setEvalBranchQuota(1001);
var i = 0;
while (i < 1001) : (i += 1) {}
}
}
comptime 블록 안에서 분기 한도를 1001로 올려 주니, 이번엔 테스트가 무사히 통과해요.
$ zig test test_setEvalBranchQuota_builtin.zig
1/1 test_setEvalBranchQuota_builtin.test.foo...OK
All 1 tests passed.