From 4d7279b0046624ed7b999d4f6a66594c1be41d4b Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Fri, 28 Sep 2018 19:35:34 +0200 Subject: [PATCH] fix lsb, msb result data type --- compiler/src/prog8/StackVmMain.kt | 6 +-- compiler/src/prog8/stackvm/StackVm.kt | 4 +- compiler/test/ValueOperationsTests.kt | 61 ++++++++++++++++++++++++--- 3 files changed, 60 insertions(+), 11 deletions(-) diff --git a/compiler/src/prog8/StackVmMain.kt b/compiler/src/prog8/StackVmMain.kt index ef03e47cf..497dc339d 100644 --- a/compiler/src/prog8/StackVmMain.kt +++ b/compiler/src/prog8/StackVmMain.kt @@ -17,9 +17,9 @@ fun main(args: Array) { } val program = Program.load(args.first()) - //val irqProgram = Program("irq", mutableListOf(), emptyMap(), emptyMap(), emptyMap()) - val irqProgram = Program.load("irq_stackvm.txt") - val vm = StackVm(traceOutputFile = null) + val irqProgram = Program("irq", mutableListOf(), emptyMap(), emptyMap(), emptyMap()) + //val irqProgram = Program.load("irq_stackvm.txt") + val vm = StackVm(traceOutputFile = "stackvm.log") val dialog = ScreenDialog() vm.load(program, irqProgram, dialog.canvas) EventQueue.invokeLater { diff --git a/compiler/src/prog8/stackvm/StackVm.kt b/compiler/src/prog8/stackvm/StackVm.kt index a7301046b..bd088b8e5 100644 --- a/compiler/src/prog8/stackvm/StackVm.kt +++ b/compiler/src/prog8/stackvm/StackVm.kt @@ -517,7 +517,7 @@ class Value(val type: DataType, numericvalue: Number?, val stringvalue: String?= fun lsb(): Value { return when(type) { DataType.BYTE -> Value(DataType.BYTE, byteval!!) - DataType.WORD -> Value(DataType.WORD, wordval!! and 255) + DataType.WORD -> Value(DataType.BYTE, wordval!! and 255) else -> throw VmExecutionException("not can only work on byte/word") } } @@ -525,7 +525,7 @@ class Value(val type: DataType, numericvalue: Number?, val stringvalue: String?= fun msb(): Value { return when(type) { DataType.BYTE -> Value(DataType.BYTE, 0) - DataType.WORD -> Value(DataType.WORD, wordval!! ushr 8 and 255) + DataType.WORD -> Value(DataType.BYTE, wordval!! ushr 8 and 255) else -> throw VmExecutionException("not can only work on byte/word") } } diff --git a/compiler/test/ValueOperationsTests.kt b/compiler/test/ValueOperationsTests.kt index d0859ed58..aff5cd86d 100644 --- a/compiler/test/ValueOperationsTests.kt +++ b/compiler/test/ValueOperationsTests.kt @@ -11,6 +11,15 @@ import prog8.stackvm.VmExecutionException import kotlin.test.* +private fun sameValueAndType(v1: Value, v2: Value): Boolean { + return v1.type==v2.type && v1==v2 +} + +private fun sameValueAndType(lv1: LiteralValue, lv2: LiteralValue): Boolean { + return lv1.type==lv2.type && lv1==lv2 +} + + @TestInstance(TestInstance.Lifecycle.PER_CLASS) class TestStackVmValue { @@ -24,7 +33,7 @@ class TestStackVmValue { assertFalse(vv) - assertEquals(Value(DataType.BYTE, 100), Value(DataType.BYTE, 100)) + assertTrue(sameValueAndType(Value(DataType.BYTE, 100), Value(DataType.BYTE, 100))) } @Test @@ -39,6 +48,16 @@ class TestStackVmValue { assertEquals(Value(DataType.FLOAT, 22239.0), Value(DataType.WORD, 22239)) assertEquals(Value(DataType.FLOAT, 9.99), Value(DataType.FLOAT, 9.99)) + assertTrue(sameValueAndType(Value(DataType.BYTE, 100), Value(DataType.BYTE, 100))) + assertFalse(sameValueAndType(Value(DataType.BYTE, 100), Value(DataType.WORD, 100))) + assertFalse(sameValueAndType(Value(DataType.BYTE, 100), Value(DataType.FLOAT, 100))) + assertFalse(sameValueAndType(Value(DataType.WORD, 254), Value(DataType.BYTE, 254))) + assertTrue(sameValueAndType(Value(DataType.WORD, 12345), Value(DataType.WORD, 12345))) + assertFalse(sameValueAndType(Value(DataType.WORD, 12345), Value(DataType.FLOAT, 12345))) + assertFalse(sameValueAndType(Value(DataType.FLOAT, 100.0), Value(DataType.BYTE, 100))) + assertFalse(sameValueAndType(Value(DataType.FLOAT, 22239.0), Value(DataType.WORD, 22239))) + assertTrue(sameValueAndType(Value(DataType.FLOAT, 9.99), Value(DataType.FLOAT, 9.99))) + assertNotEquals(Value(DataType.BYTE, 100), Value(DataType.BYTE, 101)) assertNotEquals(Value(DataType.BYTE, 100), Value(DataType.WORD, 101)) assertNotEquals(Value(DataType.BYTE, 100), Value(DataType.FLOAT, 101)) @@ -49,11 +68,21 @@ class TestStackVmValue { assertNotEquals(Value(DataType.FLOAT, 9.99), Value(DataType.WORD, 9)) assertNotEquals(Value(DataType.FLOAT, 9.99), Value(DataType.FLOAT, 9.0)) + assertFalse(sameValueAndType(Value(DataType.BYTE, 100), Value(DataType.BYTE, 101))) + assertFalse(sameValueAndType(Value(DataType.BYTE, 100), Value(DataType.WORD, 101))) + assertFalse(sameValueAndType(Value(DataType.BYTE, 100), Value(DataType.FLOAT, 101))) + assertFalse(sameValueAndType(Value(DataType.WORD, 245), Value(DataType.BYTE, 246))) + assertFalse(sameValueAndType(Value(DataType.WORD, 12345), Value(DataType.WORD, 12346))) + assertFalse(sameValueAndType(Value(DataType.WORD, 12345), Value(DataType.FLOAT, 12346))) + assertFalse(sameValueAndType(Value(DataType.FLOAT, 9.99), Value(DataType.BYTE, 9))) + assertFalse(sameValueAndType(Value(DataType.FLOAT, 9.99), Value(DataType.WORD, 9))) + assertFalse(sameValueAndType(Value(DataType.FLOAT, 9.99), Value(DataType.FLOAT, 9.0))) + assertFailsWith { - assertEquals(Value(DataType.STR, null, "hello"), Value(DataType.STR, null, "hello")) + assertTrue(sameValueAndType(Value(DataType.STR, null, "hello"), Value(DataType.STR, null, "hello"))) } assertFailsWith { - assertEquals(Value(DataType.ARRAY, null, arrayvalue = intArrayOf(1,2,3)), Value(DataType.ARRAY, null, arrayvalue = intArrayOf(1,2,3))) + assertTrue(sameValueAndType(Value(DataType.ARRAY, null, arrayvalue = intArrayOf(1,2,3)), Value(DataType.ARRAY, null, arrayvalue = intArrayOf(1,2,3)))) } } @@ -238,7 +267,7 @@ class TestParserLiteralValue { assertFalse(v < v) assertFalse(v > v) - assertEquals(LiteralValue(DataType.WORD, wordvalue = 12345, position = dummyPos), LiteralValue(DataType.WORD, wordvalue = 12345, position = dummyPos)) + assertTrue(sameValueAndType(LiteralValue(DataType.WORD, wordvalue = 12345, position = dummyPos), LiteralValue(DataType.WORD, wordvalue = 12345, position = dummyPos))) } @Test @@ -253,6 +282,16 @@ class TestParserLiteralValue { assertEquals(LiteralValue(DataType.FLOAT, floatvalue=22239.0, position=dummyPos), LiteralValue(DataType.WORD,wordvalue=22239, position=dummyPos)) assertEquals(LiteralValue(DataType.FLOAT, floatvalue=9.99, position=dummyPos), LiteralValue(DataType.FLOAT, floatvalue=9.99, position=dummyPos)) + assertTrue(sameValueAndType(LiteralValue(DataType.BYTE, 100, position=dummyPos), LiteralValue(DataType.BYTE, 100, position=dummyPos))) + assertFalse(sameValueAndType(LiteralValue(DataType.BYTE, 100, position=dummyPos), LiteralValue(DataType.WORD, wordvalue=100, position=dummyPos))) + assertFalse(sameValueAndType(LiteralValue(DataType.BYTE, 100, position=dummyPos), LiteralValue(DataType.FLOAT, floatvalue=100.0, position=dummyPos))) + assertFalse(sameValueAndType(LiteralValue(DataType.WORD, wordvalue=254, position=dummyPos), LiteralValue(DataType.BYTE, 254, position=dummyPos))) + assertTrue(sameValueAndType(LiteralValue(DataType.WORD, wordvalue=12345, position=dummyPos), LiteralValue(DataType.WORD, wordvalue=12345, position=dummyPos))) + assertFalse(sameValueAndType(LiteralValue(DataType.WORD, wordvalue=12345, position=dummyPos), LiteralValue(DataType.FLOAT, floatvalue=12345.0, position=dummyPos))) + assertFalse(sameValueAndType(LiteralValue(DataType.FLOAT, floatvalue=100.0, position=dummyPos), LiteralValue(DataType.BYTE, 100, position=dummyPos))) + assertFalse(sameValueAndType(LiteralValue(DataType.FLOAT, floatvalue=22239.0, position=dummyPos), LiteralValue(DataType.WORD,wordvalue=22239, position=dummyPos))) + assertTrue(sameValueAndType(LiteralValue(DataType.FLOAT, floatvalue=9.99, position=dummyPos), LiteralValue(DataType.FLOAT, floatvalue=9.99, position=dummyPos))) + assertNotEquals(LiteralValue(DataType.BYTE, 100, position=dummyPos), LiteralValue(DataType.BYTE, 101, position=dummyPos)) assertNotEquals(LiteralValue(DataType.BYTE, 100, position=dummyPos), LiteralValue(DataType.WORD, wordvalue=101, position=dummyPos)) assertNotEquals(LiteralValue(DataType.BYTE, 100, position=dummyPos), LiteralValue(DataType.FLOAT, floatvalue=101.0, position=dummyPos)) @@ -263,8 +302,18 @@ class TestParserLiteralValue { assertNotEquals(LiteralValue(DataType.FLOAT, floatvalue=9.99, position=dummyPos), LiteralValue(DataType.WORD, wordvalue=9, position=dummyPos)) assertNotEquals(LiteralValue(DataType.FLOAT, floatvalue=9.99, position=dummyPos), LiteralValue(DataType.FLOAT, floatvalue=9.0, position=dummyPos)) - assertEquals(LiteralValue(DataType.STR, strvalue = "hello", position=dummyPos), LiteralValue(DataType.STR, strvalue="hello", position=dummyPos)) - assertNotEquals(LiteralValue(DataType.STR, strvalue = "hello", position=dummyPos), LiteralValue(DataType.STR, strvalue="bye", position=dummyPos)) + assertFalse(sameValueAndType(LiteralValue(DataType.BYTE, 100, position=dummyPos), LiteralValue(DataType.BYTE, 101, position=dummyPos))) + assertFalse(sameValueAndType(LiteralValue(DataType.BYTE, 100, position=dummyPos), LiteralValue(DataType.WORD, wordvalue=101, position=dummyPos))) + assertFalse(sameValueAndType(LiteralValue(DataType.BYTE, 100, position=dummyPos), LiteralValue(DataType.FLOAT, floatvalue=101.0, position=dummyPos))) + assertFalse(sameValueAndType(LiteralValue(DataType.WORD, wordvalue=245, position=dummyPos), LiteralValue(DataType.BYTE, 246, position=dummyPos))) + assertFalse(sameValueAndType(LiteralValue(DataType.WORD, wordvalue=12345, position=dummyPos), LiteralValue(DataType.WORD, wordvalue=12346, position=dummyPos))) + assertFalse(sameValueAndType(LiteralValue(DataType.WORD, wordvalue=12345, position=dummyPos), LiteralValue(DataType.FLOAT, floatvalue=12346.0, position=dummyPos))) + assertFalse(sameValueAndType(LiteralValue(DataType.FLOAT, floatvalue=9.99, position=dummyPos), LiteralValue(DataType.BYTE, 9, position=dummyPos))) + assertFalse(sameValueAndType(LiteralValue(DataType.FLOAT, floatvalue=9.99, position=dummyPos), LiteralValue(DataType.WORD, wordvalue=9, position=dummyPos))) + assertFalse(sameValueAndType(LiteralValue(DataType.FLOAT, floatvalue=9.99, position=dummyPos), LiteralValue(DataType.FLOAT, floatvalue=9.0, position=dummyPos))) + + assertTrue(sameValueAndType(LiteralValue(DataType.STR, strvalue = "hello", position=dummyPos), LiteralValue(DataType.STR, strvalue="hello", position=dummyPos))) + assertFalse(sameValueAndType(LiteralValue(DataType.STR, strvalue = "hello", position=dummyPos), LiteralValue(DataType.STR, strvalue="bye", position=dummyPos))) val lvOne = LiteralValue(DataType.BYTE, 1, position=dummyPos) val lvTwo = LiteralValue(DataType.BYTE, 2, position=dummyPos)