diff options
| author | Mel <einebeere@gmail.com> | 2022-06-07 09:36:27 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-07 09:36:27 +0000 |
| commit | 144f49d64e3fc11d334900e90d30c8620ca2991b (patch) | |
| tree | 026dbfedc013a06f139ac1f363cd1b642689ece3 /pkg/lang/vm/text/compiler_test.go | |
| parent | e57216d3b29ba9688918972c683da3ab0da3ad95 (diff) | |
| download | jinx-144f49d64e3fc11d334900e90d30c8620ca2991b.tar.zst jinx-144f49d64e3fc11d334900e90d30c8620ca2991b.zip | |
Add builder for VM bytecode
Diffstat (limited to 'pkg/lang/vm/text/compiler_test.go')
| -rw-r--r-- | pkg/lang/vm/text/compiler_test.go | 166 |
1 files changed, 82 insertions, 84 deletions
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 +// } |
