@setEvalBranchQuota — 컴파일 타임 실행의 역분기 한도를 직접 올려주는 내장 함수

@setEvalBranchQuota — 컴파일 타임 실행의 역분기 한도를 직접 올려주는 내장 함수

출처: Zig Documentation

본문

컴파일 타임 코드를 돌리다 보면, 포기하고 컴파일 에러를 내기 전까지 실행이 얼마나 많은 뒤로 가는 분기(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.

더 알아보기