Przeglądaj źródła

хотел начать тестирование, выяснились проблемы в менеджере стека, добавил отображение стека в лог

p.kushnir 10 lat temu
rodzic
commit
795eab1f35
12 zmienionych plików z 112 dodań i 39 usunięć
  1. BIN
      code/XevLog.oz
  2. BIN
      code/XevTest0.oz
  3. 1 1
      fw.go
  4. 27 24
      fw_test.bat
  5. 11 1
      rt2/nodeframe/frame.go
  6. 13 4
      rt2/rules/deref.go
  7. 1 1
      rt2/rules/table.go
  8. 1 0
      rt2/scope/area.go
  9. 20 2
      rt2/scope/std/heap.go
  10. 35 4
      rt2/scope/std/scope.go
  11. 1 1
      utils/debug.go
  12. 2 1
      xev/converter.go

BIN
code/XevLog.oz


BIN
code/XevTest0.oz


+ 1 - 1
fw.go

@@ -27,7 +27,7 @@ func close() {
 func main() {
 	flag.Parse()
 	if name == "" {
-		name = "XevDemo22"
+		name = "XevTest0"
 	}
 	global := &stdDomain{god: true}
 	modList := rtmod.New()

+ 27 - 24
fw_test.bat

@@ -1,49 +1,51 @@
 @echo off 
-fw -i=XevDemo0
+fw -i=XevDemo0 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo1
+fw -i=XevDemo1 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo2
+fw -i=XevDemo2 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo3
+fw -i=XevDemo3 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo4
+fw -i=XevDemo4 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo5
+fw -i=XevDemo5 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo6
+fw -i=XevDemo6 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo7
+fw -i=XevDemo7 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo8
+fw -i=XevDemo8 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo9
+fw -i=XevDemo9 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo10
+fw -i=XevDemo10 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo11
+fw -i=XevDemo11 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo12
+fw -i=XevDemo12 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo13
+fw -i=XevDemo13 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo14
+fw -i=XevDemo14 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo15
+fw -i=XevDemo15 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo16
+fw -i=XevDemo16 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo17
+fw -i=XevDemo17 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo18
+fw -i=XevDemo18 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo19
+fw -i=XevDemo19 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo20
+fw -i=XevDemo20 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo21
+fw -i=XevDemo21 > .out
 IF ERRORLEVEL 1 GOTO err
-fw -i=XevDemo22
+fw -i=XevDemo22 > .out
+IF ERRORLEVEL 1 GOTO err
+fw -i=XevTest0 > .out
 IF ERRORLEVEL 1 GOTO err
 
 GOTO ok
@@ -51,4 +53,5 @@ GOTO ok
 echo FAILED
 pause
 
-:ok
+:ok
+del .out

+ 11 - 1
rt2/nodeframe/frame.go

@@ -55,10 +55,19 @@ type nodeFrame struct {
 	num    int64
 }
 
+func done(f frame.Frame) {
+	fmt.Println("____")
+	fmt.Println(f.Domain().Discover(context.SCOPE))
+	fmt.Println("--")
+	fmt.Println(f.Domain().Discover(context.HEAP))
+	fmt.Println("^^^^")
+}
+
 func (f *nodeFrame) Do() frame.WAIT {
 	assert.For(f.seq != nil, 20)
 	next, ret := f.seq(f)
-	utils.PrintFrame(f.num, ret, reflect.TypeOf(f.ir))
+	utils.PrintFrame(f.num, ret, reflect.TypeOf(f.ir), f.ir)
+	fmt.Println("data:", f.data)
 	if next != nil {
 		assert.For(ret != frame.STOP, 40)
 		f.seq = next
@@ -69,6 +78,7 @@ func (f *nodeFrame) Do() frame.WAIT {
 		}
 
 	}
+	defer done(f)
 	return ret
 }
 

+ 13 - 4
rt2/rules/deref.go

@@ -13,14 +13,23 @@ import (
 func derefSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 	n := rt2.NodeOf(f)
 	sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
+	x := rt2.DataOf(f.Parent())[n]
 	fmt.Println("deref from ptr", n.(node.DerefNode).Ptr())
-	_, ok := rt2.DataOf(f.Parent())[n].(scope.ID)
+	_, ok := x.(scope.ID)
 	if ok {
 		rt2.DataOf(f.Parent())[n] = scope.Designator(n.Left())
 	} else {
-		data := sc.Select(scope.Designator(n.Left()))
-		assert.For(data != nil, 40)
-		rt2.DataOf(f.Parent())[n] = data
+		for z := n.Left(); !ok && z != nil; {
+			switch z.(type) {
+			case node.DerefNode:
+				z = z.Left()
+			default:
+				data := sc.Select(scope.Designator(z))
+				assert.For(data != nil, 40)
+				rt2.DataOf(f.Parent())[n] = data
+				ok = true
+			}
+		}
 	}
 	return frame.End()
 }

+ 1 - 1
rt2/rules/table.go

@@ -223,7 +223,7 @@ func run(global context.Domain, init []*module.Module) {
 		i := 0
 		t0 := time.Now()
 		for x := frame.NOW; x == frame.NOW; x = root.Do() {
-			//fmt.Println(x)
+			fmt.Println("STEP", i)
 			i++
 		}
 		t1 := time.Now()

+ 1 - 0
rt2/scope/area.go

@@ -48,6 +48,7 @@ type Manager interface {
 	Update(id ID, val ValueFor)
 	Select(id ID) interface{}
 	Target(...Allocator) Allocator
+	String() string
 }
 
 type Allocator interface{}

+ 20 - 2
rt2/scope/std/heap.go

@@ -29,6 +29,11 @@ func nh() scope.Manager {
 	return &heap{data: &area{ready: true, root: nil, x: make(map[scope.ID]interface{})}}
 }
 
+func (h *heap) String() (ret string) {
+	ret = fmt.Sprintln("HEAP")
+	ret = fmt.Sprintln(ret, h.data)
+	return fmt.Sprint(ret, "END")
+}
 func (h *heap) Allocate(n node.Node, par ...interface{}) (ret scope.ValueFor) {
 	var talloc func(t object.PointerType) (oid scope.ID)
 	talloc = func(t object.PointerType) (oid scope.ID) {
@@ -48,7 +53,15 @@ func (h *heap) Allocate(n node.Node, par ...interface{}) (ret scope.ValueFor) {
 			alloc(nil, h.data, oid, r)
 		case object.DynArrayType:
 			assert.For(len(par) > 0, 20)
-			p := int64(par[0].(int32))
+			var p int64
+			switch x := par[0].(type) {
+			case int64:
+				p = x
+			case int32:
+				p = int64(x)
+			default:
+				panic("mistyped parameter")
+			}
 			fake := object.New(object.VARIABLE)
 			fake.SetComplex(bt)
 			fake.SetType(object.COMPLEX)
@@ -148,7 +161,6 @@ func (h *heap) Select(i scope.ID) interface{} {
 	sel = func(x interface{}) (ret *result) {
 		fmt.Println(x)
 		switch x := x.(type) {
-
 		case record:
 			if i.Path == "" {
 				ret = &result{x: x.(*rec).link}
@@ -156,6 +168,12 @@ func (h *heap) Select(i scope.ID) interface{} {
 				z := x.getField(i.Path)
 				ret = sel(z)
 			}
+		case array:
+			if i.Index != nil {
+				ret = &result{x: x.get(*i.Index)}
+			} else {
+				ret = &result{x: x.sel()}
+			}
 		default:
 			panic(0)
 		}

+ 35 - 4
rt2/scope/std/scope.go

@@ -23,6 +23,7 @@ type manager struct {
 type KVarea interface {
 	set(scope.ID, interface{})
 	get(scope.ID) interface{}
+	String() string
 }
 
 type area struct {
@@ -37,6 +38,7 @@ func area_fin(a interface{}) {
 
 func (a *area) set(k scope.ID, v interface{}) {
 	key := scope.ID{Name: k.Name}
+	fmt.Println(k, key)
 	a.x[key] = v
 }
 
@@ -45,6 +47,14 @@ func (a *area) get(k scope.ID) interface{} {
 	return a.x[key]
 }
 
+func (a *area) String() (ret string) {
+	ret = fmt.Sprintln("AREA")
+	for k, v := range a.x {
+		ret = fmt.Sprintln(ret, "key:", k, "type:", reflect.TypeOf(v), "value:", v)
+	}
+	return fmt.Sprint(ret, "END")
+}
+
 type value interface {
 	set(x interface{})
 	get() interface{}
@@ -133,11 +143,30 @@ func (a *rec) set(k scope.ID, v interface{}) { a.x[k] = v }
 
 func (a *rec) get(k scope.ID) interface{} { return a.x[k] }
 
+func (a *rec) String() (ret string) {
+	ret = fmt.Sprintln("RECORD")
+	for k, v := range a.x {
+		ret = fmt.Sprintln(ret, "key:", k, "value:", v)
+	}
+	return fmt.Sprint(ret, "END")
+}
+
 func nm() scope.Manager {
 	m := &manager{areas: list.New()}
 	return m
 }
 
+func (m *manager) String() (ret string) {
+	ret = fmt.Sprintln("SCOPE")
+	i := 0
+	for s := m.areas.Back(); s != nil; s = s.Prev() {
+		a := s.Value.(*area)
+		ret = fmt.Sprintln(ret, i, a)
+		i++
+	}
+	return fmt.Sprint(ret, "END")
+}
+
 func init() {
 	scope.NewStack = nm
 	scope.Designator = design
@@ -162,7 +191,7 @@ func design(n ...node.Node) (id scope.ID) {
 	case node.IndexNode:
 		id = scope.ID{Name: x.Left().Object().Name()}
 	default:
-		panic(fmt.Sprintln("unsupported", reflect.TypeOf(n)))
+		panic(fmt.Sprintln("unsupported", reflect.TypeOf(x)))
 	}
 	return id
 }
@@ -245,8 +274,10 @@ func (m *manager) Allocate(n node.Node, final bool) {
 	mod := rt_mod.DomainModule(m.Domain())
 	for _, o := range mod.Objects[n] {
 		k, v := obj(o)
-		//fmt.Println(k, v)
-		alloc(n, h, k, v)
+		if v != nil {
+			//fmt.Println(k, v)
+			alloc(n, h, k, v)
+		}
 	}
 	m.areas.PushFront(h)
 	fmt.Println("allocate")
@@ -345,7 +376,7 @@ func (m *manager) Select(i scope.ID) interface{} {
 	}
 	var res *result
 	var sel func(interface{}) *result
-	fmt.Println(i)
+	fmt.Println("select", i)
 	sel = func(x interface{}) (ret *result) {
 		switch x := x.(type) {
 		case value:

+ 1 - 1
utils/debug.go

@@ -8,7 +8,7 @@ var debugTrap = true
 
 func PrintFrame(x ...interface{}) {
 	if debugFrame {
-		fmt.Println(x[0], x[1], x[2])
+		fmt.Println(x...)
 	}
 }
 

+ 2 - 1
xev/converter.go

@@ -201,7 +201,8 @@ func (r *Result) doType(n *Node) (ret object.ComplexType) {
 				}
 				ret = t
 			case "CHAR", "SHORTCHAR", "INTEGER", "LONGINT", "BYTE",
-				"SHORTINT", "BOOLEAN", "REAL", "SHORTREAL", "SET":
+				"SHORTINT", "BOOLEAN", "REAL", "SHORTREAL", "SET", "UNDEF",
+				"NOTYP", "SHORTSTRING", "STRING":
 			case "POINTER":
 				t := object.NewPointerType(n.Data.Typ.Name)
 				base := r.findLink(n, "base")