Skip to content

Commit

Permalink
Fix bug with SUB and add --lines CL arg
Browse files Browse the repository at this point in the history
  • Loading branch information
iafisher committed Dec 6, 2018
1 parent 075f039 commit 3722c4f
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 6 deletions.
13 changes: 10 additions & 3 deletions hera/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
hera (-v | --version)
Options:
--lines=<n> Only execute the first n lines of the program.
--no-dump-state Do not print the state of the virtual machine after execution.
--no-color Do not print colored output.
-h, --help Show this message.
Expand Down Expand Up @@ -67,10 +68,16 @@ def main(argv=None, vm=None):
if arguments["preprocess"]:
preprocess_program(program)
else:
execute_program(program, no_dump_state=arguments["--no-dump-state"], vm=vm)
lines_to_exec = int(arguments["--lines"]) if arguments["--lines"] else None
execute_program(
program,
lines_to_exec=lines_to_exec,
no_dump_state=arguments["--no-dump-state"],
vm=vm,
)


def execute_program(program, *, no_dump_state=False, vm=None):
def execute_program(program, *, lines_to_exec=None, no_dump_state=False, vm=None):
"""Execute the program with the given options, most of which correspond to
command-line arguments.
Expand All @@ -86,7 +93,7 @@ def execute_program(program, *, no_dump_state=False, vm=None):
program = parse(program)
typecheck(program)
program = preprocess(program)
vm.exec_many(program)
vm.exec_many(program, lines=lines_to_exec)
except HERAError as e:
if e.line:
if e.column:
Expand Down
9 changes: 6 additions & 3 deletions hera/vm.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,12 +121,13 @@ def exec_one(self, inst):
else:
handler(*inst.args)

def exec_many(self, program):
def exec_many(self, program, *, lines=None):
"""Execute a program (i.e., a list of instructions), resetting the
machine's state beforehand.
"""
terminate_at = min(lines, len(program)) if lines is not None else len(program)
self.reset()
while self.pc < len(program):
while self.pc < terminate_at:
opc = self.pc
try:
self.exec_one(program[self.pc])
Expand Down Expand Up @@ -212,7 +213,9 @@ def exec_sub(self, left, right):
result = to_u16((left - right - borrow) & 0xFFFF)

self.flag_carry = left >= right
self.flag_overflow = from_u16(result) != from_u16(left) - from_u16(right)
self.flag_overflow = (
from_u16(result) != from_u16(left) - from_u16(right) - borrow
)

return result

Expand Down
7 changes: 7 additions & 0 deletions test/test_op/test_arithmetic_logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,13 @@ def test_sub_overflow_from_borrow(vm):
assert vm.flag_overflow


def test_sub_overflow_takes_borrow_into_account(vm):
vm.registers[1] = 10
vm.registers[2] = 11
vm.exec_sub("R0", "R1", "R2")
assert not vm.flag_overflow


def test_sub_sets_carry_for_equal_operands(vm):
vm.flag_carry = True
vm.registers[1] = 12
Expand Down

0 comments on commit 3722c4f

Please sign in to comment.