Selaa lähdekoodia

бинарный формат модуля и уточнения для segment

kpmy 9 vuotta sitten
vanhempi
commit
338f5a1bb7
3 muutettua tiedostoa jossa 64 lisäystä ja 31 poistoa
  1. 39 28
      ir/ast.go
  2. 16 3
      ir/mem.go
  3. 9 0
      tiss_test.go

+ 39 - 28
ir/ast.go

@@ -1,7 +1,9 @@
 package ir //import "github.com/kpmy/tiss/ir"
 
 import (
+	"fmt"
 	"reflect"
+	"strings"
 
 	"github.com/kpmy/tiss/ir/types"
 	"github.com/kpmy/ypk/fn"
@@ -285,43 +287,52 @@ func (o *object) Children() (ret []interface{}) {
 }
 
 type Module struct {
-	ns    `sexpr:"module"`
-	Start *StartExpr
-	Func  []*FuncExpr
-	Type  []*TypeDef
-	Table *TableDef
-	Imp   []*Import
-	Exp   []*Export
-	Mem   *Memory
+	ns     `sexpr:"module"`
+	Start  *StartExpr
+	Func   []*FuncExpr
+	Type   []*TypeDef
+	Table  *TableDef
+	Imp    []*Import
+	Exp    []*Export
+	Mem    *Memory
+	Binary []byte
 }
 
 func (m *Module) Children() (ret []interface{}) {
-	if m.Mem != nil {
-		ret = append(ret, m.Mem)
-	}
+	if len(m.Binary) == 0 {
+		if m.Mem != nil {
+			ret = append(ret, m.Mem)
+		}
 
-	for _, t := range m.Type {
-		ret = append(ret, t)
-	}
+		for _, t := range m.Type {
+			ret = append(ret, t)
+		}
 
-	if m.Table != nil {
-		ret = append(ret, m.Table)
-	}
+		if m.Table != nil {
+			ret = append(ret, m.Table)
+		}
 
-	for _, i := range m.Imp {
-		ret = append(ret, i)
-	}
+		for _, i := range m.Imp {
+			ret = append(ret, i)
+		}
 
-	for _, f := range m.Func {
-		ret = append(ret, f)
-	}
+		for _, f := range m.Func {
+			ret = append(ret, f)
+		}
 
-	for _, e := range m.Exp {
-		ret = append(ret, e)
-	}
+		for _, e := range m.Exp {
+			ret = append(ret, e)
+		}
 
-	if m.Start != nil {
-		ret = append(ret, m.Start)
+		if m.Start != nil {
+			ret = append(ret, m.Start)
+		}
+	} else {
+		s := ""
+		for _, b := range m.Binary {
+			s = fmt.Sprint(s, `\`+strings.Replace(fmt.Sprintf("%2x", b), " ", "0", -1))
+		}
+		ret = append(ret, []rune(s))
 	}
 	return
 }

+ 16 - 3
ir/mem.go

@@ -3,6 +3,7 @@ package ir
 import (
 	"fmt"
 	"strconv"
+	"strings"
 
 	"github.com/kpmy/tiss/ir/types"
 	"github.com/kpmy/ypk/fn"
@@ -166,12 +167,20 @@ type Memory struct {
 type Segment struct {
 	ns     `sexpr:"segment"`
 	Offset uint
-	Data   string
+	Data   []string
 }
 
 func (s *Segment) Validate() error { return nil }
 func (s *Segment) Children() (ret []interface{}) {
-	return append(ret, s.Offset, []rune(s.Data))
+	ret = append(ret, s.Offset)
+	for _, d := range s.Data {
+		s := ""
+		for _, b := range []byte(d) {
+			s = fmt.Sprint(s, `\`+strings.Replace(fmt.Sprintf("%2x", b), " ", "0", -1))
+		}
+		ret = append(ret, []rune(s))
+	}
+	return ret
 }
 
 func (m *Memory) Validate() error {
@@ -184,7 +193,11 @@ func (m *Memory) Validate() error {
 		if off > int(o.Offset) {
 			return Error(fmt.Sprint("segments overlap", i-1, o.Offset))
 		}
-		off += int(o.Offset) + len([]rune(o.Data))
+		blen := 0
+		for _, d := range o.Data {
+			blen = blen + len([]byte(d))
+		}
+		off += int(o.Offset) + blen
 	}
 
 	if off >= int(m.Max)*PageSize {

+ 9 - 0
tiss_test.go

@@ -128,6 +128,15 @@ func TestValidation(t *testing.T) {
 	l0.Name("$i")
 	l0.Type(types.I64)
 	poo(t, l0)
+
+	s := &ir.Segment{}
+	s.Offset = 0
+	s.Data = append(s.Data, "f23fcaeaef2f42f34")
+	poo(t, s)
+
+	m := &ir.Module{}
+	m.Binary = []byte{0, 1, 2, 3}
+	poo(t, m)
 	/* надо проверить все сущности
 	   Br
 	   BrIf