From 144f49d64e3fc11d334900e90d30c8620ca2991b Mon Sep 17 00:00:00 2001 From: Mel Date: Tue, 7 Jun 2022 09:36:27 +0000 Subject: Add builder for VM bytecode --- pkg/lang/vm/text/compiler_test.go | 166 +++++++++++++++++++------------------- 1 file changed, 82 insertions(+), 84 deletions(-) (limited to 'pkg/lang/vm/text/compiler_test.go') diff --git a/pkg/lang/vm/text/compiler_test.go b/pkg/lang/vm/text/compiler_test.go index 56b886d..c9e3fa1 100644 --- a/pkg/lang/vm/text/compiler_test.go +++ b/pkg/lang/vm/text/compiler_test.go @@ -1,10 +1,8 @@ package text_test import ( - "encoding/binary" "jinx/pkg/lang/vm/code" "jinx/pkg/lang/vm/text" - "math" "strings" "testing" @@ -22,13 +20,13 @@ func TestSimple(t *testing.T) { res, err := c.Compile() require.NoError(t, err) - parts := [][]byte{ - opBin(code.OpAdd), - opBin(code.OpSub), - opBin(code.OpRet), - } + exp := code.NewBuilder() - require.Equal(t, joinSlices(parts), res.Code()) + exp.AppendOp(code.OpAdd) + exp.AppendOp(code.OpSub) + exp.AppendOp(code.OpRet) + + require.Equal(t, exp.Code(), res.Code()) } func TestInt(t *testing.T) { @@ -43,16 +41,16 @@ func TestInt(t *testing.T) { res, err := c.Compile() require.NoError(t, err) - parts := [][]byte{ - opBin(code.OpPushInt), - uintBin(1), - opBin(code.OpPushInt), - uintBin(2), - opBin(code.OpAdd), - opBin(code.OpRet), - } + exp := code.NewBuilder() + + exp.AppendOp(code.OpPushInt) + exp.AppendInt(1) + exp.AppendOp(code.OpPushInt) + exp.AppendInt(2) + exp.AppendOp(code.OpAdd) + exp.AppendOp(code.OpRet) - require.Equal(t, joinSlices(parts), res.Code()) + require.Equal(t, exp.Code(), res.Code()) } func TestFloat(t *testing.T) { @@ -65,14 +63,14 @@ func TestFloat(t *testing.T) { res, err := c.Compile() require.NoError(t, err) - parts := [][]byte{ - opBin(code.OpPushFloat), - floatBin(3.1415), - opBin(code.OpPushFloat), - floatBin(-2.71828), - } + exp := code.NewBuilder() + + exp.AppendOp(code.OpPushFloat) + exp.AppendFloat(3.1415) + exp.AppendOp(code.OpPushFloat) + exp.AppendFloat(-2.71828) - require.Equal(t, joinSlices(parts), res.Code()) + require.Equal(t, exp.Code(), res.Code()) } func TestString(t *testing.T) { @@ -86,15 +84,15 @@ func TestString(t *testing.T) { res, err := c.Compile() require.NoError(t, err) - parts := [][]byte{ - opBin(code.OpPushString), - stringBin("Hello, "), - opBin(code.OpPushString), - stringBin("world!"), - opBin(code.OpAdd), - } + exp := code.NewBuilder() - require.Equal(t, joinSlices(parts), res.Code()) + exp.AppendOp(code.OpPushString) + exp.AppendString("Hello, ") + exp.AppendOp(code.OpPushString) + exp.AppendString("world!") + exp.AppendOp(code.OpAdd) + + require.Equal(t, exp.Code(), res.Code()) } func TestLabels(t *testing.T) { @@ -114,19 +112,19 @@ func TestLabels(t *testing.T) { res, err := c.Compile() require.NoError(t, err) - parts := [][]byte{ - opBin(code.OpNop), - opBin(code.OpNop), - opBin(code.OpNop), - opBin(code.OpJmp), - uintBin(0), - opBin(code.OpJmp), - uintBin(1), - opBin(code.OpJmp), - uintBin(2), - } - - require.Equal(t, joinSlices(parts), res.Code()) + exp := code.NewBuilder() + + exp.AppendOp(code.OpNop) + exp.AppendOp(code.OpNop) + exp.AppendOp(code.OpNop) + exp.AppendOp(code.OpJmp) + exp.AppendInt(0) + exp.AppendOp(code.OpJmp) + exp.AppendInt(1) + exp.AppendOp(code.OpJmp) + exp.AppendInt(2) + + require.Equal(t, exp.Code(), res.Code()) } func TestDebugInfo(t *testing.T) { @@ -146,46 +144,46 @@ func TestDebugInfo(t *testing.T) { res, err := c.Compile() require.NoError(t, err) - expected := code.NewDebugInfo("unknown file") - - expected.AppendLine(8, 1) - expected.AppendLine(17, 2) - expected.AppendLine(18, 4) - expected.AppendLine(19, 5) - expected.AppendLine(20, 8) - expected.AppendLine(21, 9) + exp := code.NewDebugInfo("unknown file") - require.Equal(t, expected, *res.Debug()) -} + exp.AppendLine(8, 1) + exp.AppendLine(17, 2) + exp.AppendLine(18, 4) + exp.AppendLine(19, 5) + exp.AppendLine(20, 8) + exp.AppendLine(21, 9) -func opBin(op code.Op) []byte { - return []byte{byte(op)} + require.Equal(t, exp, *res.Debug()) } -func uintBin(x uint64) []byte { - res := make([]byte, 8) - binary.LittleEndian.PutUint64(res, x) - return res -} - -func floatBin(x float64) []byte { - res := make([]byte, 8) - binary.LittleEndian.PutUint64(res, math.Float64bits(x)) - return res -} - -func stringBin(x string) []byte { - res := []byte(x) - res = append(res, 0) - return res -} - -func joinSlices[T any](slices [][]T) []T { - res := []T{} - - for _, slice := range slices { - res = append(res, slice...) - } - - return res -} +// func opBin(op code.Op) []byte { +// return []byte{byte(op)} +// } + +// func uintBin(x uint64) []byte { +// res := make([]byte, 8) +// binary.LittleEndian.PutUint64(res, x) +// return res +// } + +// func floatBin(x float64) []byte { +// res := make([]byte, 8) +// binary.LittleEndian.PutUint64(res, math.Float64bits(x)) +// return res +// } + +// func stringBin(x string) []byte { +// res := []byte(x) +// res = append(res, 0) +// return res +// } + +// func joinSlices[T any](slices [][]T) []T { +// res := []T{} + +// for _, slice := range slices { +// res = append(res, slice...) +// } + +// return res +// } -- cgit 1.4.1