From 8e38b86ab01603b67eb563a5e909b9317f4dd700 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Mon, 19 Apr 2021 10:30:21 -0700 Subject: add some checks Even if they duplicate lower-level ones, we have an opportunity for better error messages. Any time I see a hard-to-debug error message, I should be asking myself, "what higher-level primitive should catch and improve this error?" --- 500fake-screen.mu | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/500fake-screen.mu b/500fake-screen.mu index 4aefc694..5cf925a9 100644 --- a/500fake-screen.mu +++ b/500fake-screen.mu @@ -151,13 +151,29 @@ fn draw-code-point screen: (addr screen), c: code-point, x: int, y: int, color: # not really needed for a real screen, though it shouldn't do any harm fn screen-cell-index _screen: (addr screen), x: int, y: int -> _/ecx: int { var screen/esi: (addr screen) <- copy _screen - # only one bounds check isn't automatically handled + { + compare x, 0 + break-if->= + abort "screen-cell-index: negative x" + } { var xmax/eax: (addr int) <- get screen, width var xcurr/ecx: int <- copy x compare xcurr, *xmax break-if-< - abort "tried to print out of screen bounds" + abort "screen-cell-index: x too high" + } + { + compare y, 0 + break-if->= + abort "screen-cell-index: negative y" + } + { + var ymax/eax: (addr int) <- get screen, width + var ycurr/ecx: int <- copy y + compare ycurr, *ymax + break-if-< + abort "screen-cell-index: y too high" } var width-addr/eax: (addr int) <- get screen, width var result/ecx: int <- copy y -- cgit 1.4.1-2-gfad0