aboutsummaryrefslogtreecommitdiffstats
path: root/prog/encoding.go
diff options
context:
space:
mode:
Diffstat (limited to 'prog/encoding.go')
-rw-r--r--prog/encoding.go43
1 files changed, 21 insertions, 22 deletions
diff --git a/prog/encoding.go b/prog/encoding.go
index 7a38b680f..86577cd12 100644
--- a/prog/encoding.go
+++ b/prog/encoding.go
@@ -30,10 +30,10 @@ func (p *Prog) Serialize() []byte {
}
}
buf := new(bytes.Buffer)
- vars := make(map[Arg]int)
+ vars := make(map[*ResultArg]int)
varSeq := 0
for _, c := range p.Calls {
- if isUsed(c.Ret) {
+ if len(c.Ret.uses) != 0 {
fmt.Fprintf(buf, "r%v = ", varSeq)
vars[c.Ret] = varSeq
varSeq++
@@ -53,16 +53,11 @@ func (p *Prog) Serialize() []byte {
return buf.Bytes()
}
-func (target *Target) serialize(arg Arg, buf *bytes.Buffer, vars map[Arg]int, varSeq *int) {
+func (target *Target) serialize(arg Arg, buf *bytes.Buffer, vars map[*ResultArg]int, varSeq *int) {
if arg == nil {
fmt.Fprintf(buf, "nil")
return
}
- if isUsed(arg) {
- fmt.Fprintf(buf, "<r%v=>", *varSeq)
- vars[arg] = *varSeq
- *varSeq++
- }
switch a := arg.(type) {
case *ConstArg:
fmt.Fprintf(buf, "0x%x", a.Val)
@@ -130,6 +125,11 @@ func (target *Target) serialize(arg Arg, buf *bytes.Buffer, vars map[Arg]int, va
target.serialize(a.Option, buf, vars, varSeq)
}
case *ResultArg:
+ if len(a.uses) != 0 {
+ fmt.Fprintf(buf, "<r%v=>", *varSeq)
+ vars[a] = *varSeq
+ *varSeq++
+ }
if a.Res == nil {
fmt.Fprintf(buf, "0x%x", a.Val)
break
@@ -155,7 +155,7 @@ func (target *Target) Deserialize(data []byte) (prog *Prog, err error) {
Target: target,
}
p := newParser(data)
- vars := make(map[string]Arg)
+ vars := make(map[string]*ResultArg)
for p.Scan() {
if p.EOF() || p.Char() == '#' {
continue
@@ -225,7 +225,7 @@ func (target *Target) Deserialize(data []byte) (prog *Prog, err error) {
return
}
-func (target *Target) parseArg(typ Type, p *parser, vars map[string]Arg) (Arg, error) {
+func (target *Target) parseArg(typ Type, p *parser, vars map[string]*ResultArg) (Arg, error) {
r := ""
if p.Char() == '<' {
p.Parse('<')
@@ -245,12 +245,14 @@ func (target *Target) parseArg(typ Type, p *parser, vars map[string]Arg) (Arg, e
}
}
if r != "" {
- vars[r] = arg
+ if res, ok := arg.(*ResultArg); ok {
+ vars[r] = res
+ }
}
return arg, nil
}
-func (target *Target) parseArgImpl(typ Type, p *parser, vars map[string]Arg) (Arg, error) {
+func (target *Target) parseArgImpl(typ Type, p *parser, vars map[string]*ResultArg) (Arg, error) {
switch p.Char() {
case '0':
return target.parseArgInt(typ, p)
@@ -300,7 +302,7 @@ func (target *Target) parseArgInt(typ Type, p *parser) (Arg, error) {
}
}
-func (target *Target) parseArgRes(typ Type, p *parser, vars map[string]Arg) (Arg, error) {
+func (target *Target) parseArgRes(typ Type, p *parser, vars map[string]*ResultArg) (Arg, error) {
id := p.Ident()
var div, add uint64
if p.Char() == '/' {
@@ -321,11 +323,8 @@ func (target *Target) parseArgRes(typ Type, p *parser, vars map[string]Arg) (Arg
}
add = v
}
- v, ok := vars[id]
- if !ok || v == nil {
- return target.defaultArg(typ), nil
- }
- if _, ok := v.(ArgUsed); !ok {
+ v := vars[id]
+ if v == nil {
return target.defaultArg(typ), nil
}
arg := MakeResultArg(typ, v, 0)
@@ -334,7 +333,7 @@ func (target *Target) parseArgRes(typ Type, p *parser, vars map[string]Arg) (Arg
return arg, nil
}
-func (target *Target) parseArgAddr(typ Type, p *parser, vars map[string]Arg) (Arg, error) {
+func (target *Target) parseArgAddr(typ Type, p *parser, vars map[string]*ResultArg) (Arg, error) {
var typ1 Type
switch t1 := typ.(type) {
case *PtrType:
@@ -407,7 +406,7 @@ func (target *Target) parseArgString(typ Type, p *parser) (Arg, error) {
return MakeDataArg(typ, data), nil
}
-func (target *Target) parseArgStruct(typ Type, p *parser, vars map[string]Arg) (Arg, error) {
+func (target *Target) parseArgStruct(typ Type, p *parser, vars map[string]*ResultArg) (Arg, error) {
p.Parse('{')
t1, ok := typ.(*StructType)
if !ok {
@@ -442,7 +441,7 @@ func (target *Target) parseArgStruct(typ Type, p *parser, vars map[string]Arg) (
return MakeGroupArg(typ, inner), nil
}
-func (target *Target) parseArgArray(typ Type, p *parser, vars map[string]Arg) (Arg, error) {
+func (target *Target) parseArgArray(typ Type, p *parser, vars map[string]*ResultArg) (Arg, error) {
p.Parse('[')
t1, ok := typ.(*ArrayType)
if !ok {
@@ -471,7 +470,7 @@ func (target *Target) parseArgArray(typ Type, p *parser, vars map[string]Arg) (A
return MakeGroupArg(typ, inner), nil
}
-func (target *Target) parseArgUnion(typ Type, p *parser, vars map[string]Arg) (Arg, error) {
+func (target *Target) parseArgUnion(typ Type, p *parser, vars map[string]*ResultArg) (Arg, error) {
t1, ok := typ.(*UnionType)
if !ok {
eatExcessive(p, true)