Skip to content

Commit

Permalink
Refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
noelwelsh committed Dec 10, 2023
1 parent 9069076 commit 7e2123b
Showing 1 changed file with 19 additions and 16 deletions.
35 changes: 19 additions & 16 deletions core/src/main/scala/arithmetic/ByteCode.scala
Original file line number Diff line number Diff line change
Expand Up @@ -50,29 +50,29 @@ object ByteCode {
def loop(expr: Expression): Unit =
expr match {
case Literal(value) =>
program(pp) = Op.Lit
program(pp) = Op.Lit.code
data(dp) = value
pp = pp + 1
dp = dp + 1
case Addition(left, right) =>
loop(left)
loop(right)
program(pp) = Op.Add
program(pp) = Op.Add.code
pp = pp + 1
case Subtraction(left, right) =>
loop(left)
loop(right)
program(pp) = Op.Sub
program(pp) = Op.Sub.code
pp = pp + 1
case Multiplication(left, right) =>
loop(left)
loop(right)
program(pp) = Op.Mul
program(pp) = Op.Mul.code
pp = pp + 1
case Division(left, right) =>
loop(left)
loop(right)
program(pp) = Op.Div
program(pp) = Op.Div.code
pp = pp + 1
}

Expand All @@ -89,12 +89,15 @@ object ByteCode {
def literal(value: Double): Expression = Literal(value)
}

object Op {
val Lit: Byte = 0
val Add: Byte = 1
val Sub: Byte = 2
val Mul: Byte = 3
val Div: Byte = 4
enum Op {
val code: Byte =
this.ordinal.toByte

case Lit
case Add
case Sub
case Mul
case Div
}

final case class Program(program: IArray[Byte], data: IArray[Double]) {
Expand All @@ -114,25 +117,25 @@ object ByteCode {
if (pc == program.size) stack(sp - 1)
else
program(pc) match {
case Op.Lit =>
case Op.Lit.code =>
stack(sp) = data(dp)
loop(sp + 1, dp + 1, pc + 1)
case Op.Add =>
case Op.Add.code =>
val a = stack(sp - 1)
val b = stack(sp - 2)
stack(sp - 2) = (a + b)
loop(sp - 1, dp, pc + 1)
case Op.Sub =>
case Op.Sub.code =>
val a = stack(sp - 1)
val b = stack(sp - 2)
stack(sp - 2) = (a - b)
loop(sp - 1, dp, pc + 1)
case Op.Mul =>
case Op.Mul.code =>
val a = stack(sp - 1)
val b = stack(sp - 2)
stack(sp - 2) = (a * b)
loop(sp - 1, dp, pc + 1)
case Op.Div =>
case Op.Div.code =>
val a = stack(sp - 1)
val b = stack(sp - 2)
stack(sp - 2) = (a / b)
Expand Down

0 comments on commit 7e2123b

Please sign in to comment.