[Snek] [keith-packard/snek] 5028f3: Correct stack usage during chained comparison oper...

Keith Packard noreply at github.com
Fri Jan 14 12:45:02 PST 2022


  Branch: refs/heads/compare-chain
  Home:   https://github.com/keith-packard/snek
  Commit: 5028f35ce08caab42b8cc260ac53df9fd6c21985
      https://github.com/keith-packard/snek/commit/5028f35ce08caab42b8cc260ac53df9fd6c21985
  Author: Keith Packard <keithp at keithp.com>
  Date:   2022-01-14 (Fri, 14 Jan 2022)

  Changed paths:
    M snek-exec.c
    M snek-gram.ll
    M test/pass-chain-op.py

  Log Message:
  -----------
  Correct stack usage during chained comparison operations

Chained comparison operators (a < b < c) use a "short-circuit"
mechanism much like the boolean operators 'and' and 'or'. This
requires some fancy hacks in snek and there were a few mistakes:

 1. The left-hand operand ('a') was left on the stack

 2. The second operator (b < c) would set the 'push' bit, which is on
    the first comparison operator so that 'b' would be on the
    stack. If the first comparison was false, that push wouldn't be
    appropriate. So, we reset the 'push' flag when branching.

 3. We need an instruction to land on after branching that can get the
    'push' bit set in case the following operations need it. So we
    insert a 'nop' there, just like the short-circuited 'and'/'or'
    does.

Also add some tests which detect these mistakes.

Signed-off-by: Keith Packard <keithp at keithp.com>




More information about the Snek mailing list