Skip to content

Commit

Permalink
Added immediate argument test
Browse files Browse the repository at this point in the history
  • Loading branch information
RealA10N committed Dec 3, 2024
1 parent 138e7d0 commit b1852e1
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 11 deletions.
8 changes: 5 additions & 3 deletions gen/immediate_argument.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,14 @@ func (g *ImmediateArgumentGenerator[InstT]) Generate(
ctx *GenerationContext[InstT],
node parse.ImmediateNode,
) (ArgumentInfo, core.ResultList) {
typeName := string(node.Type.Raw(ctx.SourceContext))
typeName := string(node.Type.Identifier.Raw(ctx.SourceContext))
typ := ctx.Types.GetType(typeName)
if typ == nil {
return nil, list.FromSingle(NewUndefinedTypeResult(node.View()))
}

immediate, ok := node.Value.(parse.ImmediateFinalValueNode)
if !ok {
if !ok || len(node.Type.Decorators) > 0 {
v := node.View()
return nil, list.FromSingle(core.Result{{
Type: core.ErrorResult,
Expand All @@ -44,7 +44,9 @@ func (g *ImmediateArgumentGenerator[InstT]) Generate(
}})
}

value, ok := new(big.Int).SetString(string(immediate.Raw(ctx.SourceContext)), 0)
immediate.Start += 1 // to skip the '#' character
valueStr := string(immediate.Raw(ctx.SourceContext))
value, ok := new(big.Int).SetString(valueStr, 0)
if !ok {
v := immediate.View()
return nil, list.FromSingle(core.Result{{
Expand Down
37 changes: 37 additions & 0 deletions gen/immediate_arugment_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package gen_test

import (
"testing"

"alon.kr/x/usm/core"
"alon.kr/x/usm/gen"
"alon.kr/x/usm/parse"
"github.com/stretchr/testify/assert"
)

func TestImmediateValueArgument(t *testing.T) {
src := core.NewSourceView("$32 #1337")
unmanaged := src.Unmanaged()
node := parse.ImmediateNode{
Type: parse.TypeNode{
Identifier: unmanaged.Subview(0, 3),
},
Value: parse.ImmediateFinalValueNode{
UnmanagedSourceView: unmanaged.Subview(4, 9),
},
}

intType := &gen.TypeInfo{Name: "$32", Size: 4}
types := TypeMap{intType.Name: intType}

ctx := gen.GenerationContext[Instruction]{
SourceContext: src.Ctx(),
Types: &types,
Registers: &RegisterMap{},
Instructions: &InstructionMap{},
}

generator := gen.ImmediateArgumentGenerator[Instruction]{}
_, results := generator.Generate(&ctx, node)
assert.True(t, results.IsEmpty())
}
12 changes: 5 additions & 7 deletions parse/immediate.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,30 +155,28 @@ type ImmediateBlockParser = BlockParser[ImmediateFieldNode]
// MARK: Immediate

type ImmediateNode struct {
Type core.UnmanagedSourceView
Type TypeNode
Value ImmediateValueNode
}

func (n ImmediateNode) View() core.UnmanagedSourceView {
return n.Type.MergeEnd(n.Value.View())
return n.Type.View().MergeEnd(n.Value.View())
}

func (n ImmediateNode) String(ctx *StringContext) string {
typ := string(n.Type.Raw(ctx.SourceContext))
val := n.Value.String(ctx)
return typ + " " + val
return n.Type.String(ctx) + " " + n.Value.String(ctx)
}

type ImmediateParser struct {
TypeParser
ImmediateValueParser *ImmediateValueParser
}

func (p ImmediateParser) Parse(v *TokenView) (node ImmediateNode, err core.Result) {
tkn, err := v.ConsumeToken(lex.TypeToken)
node.Type, err = p.TypeParser.Parse(v)
if err != nil {
return
}
node.Type = tkn.View

node.Value, err = p.ImmediateValueParser.Parse(v)
if err != nil {
Expand Down
5 changes: 5 additions & 0 deletions parse/immediate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ func TestImmediateValue(t *testing.T) {
testExpectedImmediate(t, src, src)
}

func TestImmediatePointerValue(t *testing.T) {
src := "$32 * #0"
testExpectedImmediate(t, src, src)
}

func TestImmediateBlockOneLine(t *testing.T) {
src := "$custom { .a #1337 .b #2902 }"
expected := `$custom {
Expand Down
4 changes: 3 additions & 1 deletion parse/instruction_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,9 @@ func TestInstructionWithImmediateValuesAndLabel(t *testing.T) {
Arguments: []parse.ArgumentNode{
parse.RegisterNode{unmanaged.Subview(22, 24)},
parse.ImmediateNode{
Type: unmanaged.Subview(25, 28),
Type: parse.TypeNode{
Identifier: unmanaged.Subview(25, 28),
},
Value: parse.ImmediateFinalValueNode{
unmanaged.Subview(29, 31),
},
Expand Down

0 comments on commit b1852e1

Please sign in to comment.