diff options
author | Philipp Gesang <phg42.2a@gmail.com> | 2014-03-23 17:21:35 +0100 |
---|---|---|
committer | Philipp Gesang <phg42.2a@gmail.com> | 2014-03-23 17:21:35 +0100 |
commit | c160c40265b5eb5670730906614997ad2545f94d (patch) | |
tree | 9d0086fd7683bc71cba383f72ca073f55f441653 /src | |
parent | 68d04a338b74a585e12df7ab3200cda389b7c964 (diff) | |
download | luaotfload-c160c40265b5eb5670730906614997ad2545f94d.tar.gz |
[tool] implement good/bad directives for bisection mode
Diffstat (limited to 'src')
-rwxr-xr-x | src/luaotfload-tool.lua | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/src/luaotfload-tool.lua b/src/luaotfload-tool.lua index e3f4516..9529a4d 100755 --- a/src/luaotfload-tool.lua +++ b/src/luaotfload-tool.lua @@ -894,9 +894,42 @@ end bisect_set -- Prepare the next bisection step by setting high, low, and pivot to new values. + The “run” directive always picks the segment below the pivot so we + can rely on the “outcome parameter” to be referring to that. + --doc]]-- local bisect_set = function (outcome) + local status = read_bisect_status () + if not status then + return false, false + end + + local nsteps = #status + local lo, hi, pivot = unpack (status[nsteps]) + report ("info", 3, "bisect", "Previous step %d: lo=%d, hi=%d, pivot=%d.", + nsteps, lo, hi, pivot) + + if outcome == "bad" then + hi = pivot + pivot = mathfloor ((lo + hi) / 2) + report ("info", 0, "bisect", + "Continuing with the lower segment: lo=%d, hi=%d, pivot=%d.", + lo, hi, pivot) + elseif outcome == "good" then + lo = pivot + pivot = mathfloor ((lo + hi) / 2) + report ("info", 0, "bisect", + "Continuing with the upper segment: lo=%d, hi=%d, pivot=%d.", + lo, hi, pivot) + else -- can’t happen + report ("info", 0, "bisect", "What the hell?", lo, hi, pivot) + return false, false + end + + status[nsteps + 1] = { lo, hi, pivot } + write_bisect_status (status) + return true, false end --[[doc-- @@ -908,7 +941,7 @@ end local bisect_status = function () local status = read_bisect_status () if not status then - return false + return false, false end local nsteps = #status if nsteps > 1 then @@ -953,8 +986,8 @@ end local bisect_modes = { start = bisect_start, - good = function () bisect_set "good" end, - bad = function () bisect_set "bad" end, + good = function () return bisect_set "good" end, + bad = function () return bisect_set "bad" end, stop = bisect_stop, status = bisect_status, run = bisect_run, |