浏览代码

изменил способ адресации данных фрейма

p.kushnir 10 年之前
父节点
当前提交
c6089584e9
共有 4 个文件被更改,包括 14 次插入14 次删除
  1. 2 2
      rt2/frame/frame.go
  2. 4 4
      rt2/nodeframe/frame.go
  3. 2 2
      rt2/rules/assign.go
  4. 6 6
      rt2/rules/op.go

+ 2 - 2
rt2/frame/frame.go

@@ -41,9 +41,9 @@ func Tail(x WAIT) (seq Sequence) {
 func End() (Sequence, WAIT) { return nil, STOP }
 
 type SetDataMsg struct {
-	Data []interface{}
+	Data interface{}
 }
 
 type GetDataMsg struct {
-	Data []interface{}
+	Data interface{}
 }

+ 4 - 4
rt2/nodeframe/frame.go

@@ -30,10 +30,10 @@ func (fu FrameUtils) NodeOf(f frame.Frame) node.Node {
 	return ff.ir
 }
 
-func (fu FrameUtils) DataOf(f frame.Frame) []interface{} {
+func (fu FrameUtils) DataOf(f frame.Frame) map[interface{}]interface{} {
 	m := new(frame.GetDataMsg)
 	f.(context.ContextAware).Handle(m)
-	return m.Data
+	return m.Data.(map[interface{}]interface{})
 }
 
 type nodeFrame struct {
@@ -42,7 +42,7 @@ type nodeFrame struct {
 	ir     node.Node
 	seq    frame.Sequence
 	domain context.Domain
-	data   []interface{}
+	data   map[interface{}]interface{}
 }
 
 func (f *nodeFrame) Do() frame.WAIT {
@@ -90,7 +90,7 @@ func (f *nodeFrame) Handle(msg interface{}) {
 	assert.For(msg != nil, 20)
 	switch msg.(type) {
 	case *frame.SetDataMsg:
-		f.data = msg.(*frame.SetDataMsg).Data
+		f.data = msg.(*frame.SetDataMsg).Data.(map[interface{}]interface{})
 	case *frame.GetDataMsg:
 		msg.(*frame.GetDataMsg).Data = f.data
 	}

+ 2 - 2
rt2/rules/assign.go

@@ -15,7 +15,7 @@ func assignSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 	switch a.(node.AssignNode).Statement() {
 	case statement.ASSIGN:
 		m := new(frame.SetDataMsg)
-		m.Data = make([]interface{}, 1)
+		m.Data = make(map[interface{}]interface{})
 		f.(context.ContextAware).Handle(m)
 		switch a.Left().(type) {
 		case node.VariableNode:
@@ -43,7 +43,7 @@ func assignSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 				seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 					sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
 					sc.Update(a.Left().Object(), func(interface{}) interface{} {
-						return fu.DataOf(f)[0]
+						return fu.DataOf(f)[a.Right()]
 					})
 					return frame.End()
 				}

+ 6 - 6
rt2/rules/op.go

@@ -35,14 +35,14 @@ func opSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 	var fu nodeframe.FrameUtils
 
 	m := new(frame.SetDataMsg)
-	m.Data = make([]interface{}, 2)
+	m.Data = make(map[interface{}]interface{}, 2)
 	f.(context.ContextAware).Handle(m)
 
 	op := func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 		n := fu.NodeOf(f)
 		switch n.(node.OperationNode).Operation() {
 		case operation.PLUS:
-			fu.DataOf(f.Parent())[0] = sum(fu.DataOf(f)[0], fu.DataOf(f)[1])
+			fu.DataOf(f.Parent())[n] = sum(fu.DataOf(f)[n.Left()], fu.DataOf(f)[n.Right()])
 			return frame.End()
 		default:
 			panic("unknown operation")
@@ -53,12 +53,12 @@ func opSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 		n := fu.NodeOf(f)
 		switch n.Right().(type) {
 		case node.ConstantNode:
-			fu.DataOf(f)[1] = n.Right().(node.ConstantNode).Data()
+			fu.DataOf(f)[n.Right()] = n.Right().(node.ConstantNode).Data()
 			return op, frame.DO
 		case node.VariableNode:
 			seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 				sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
-				fu.DataOf(f)[1] = sc.Select(n.Right().Object())
+				fu.DataOf(f)[n.Right()] = sc.Select(n.Right().Object())
 				return op, frame.DO
 			}
 			ret = frame.DO
@@ -72,12 +72,12 @@ func opSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 		n := fu.NodeOf(f)
 		switch n.Left().(type) {
 		case node.ConstantNode:
-			fu.DataOf(f)[0] = n.Left().(node.ConstantNode).Data()
+			fu.DataOf(f)[n.Left()] = n.Left().(node.ConstantNode).Data()
 			return right, frame.DO
 		case node.VariableNode:
 			seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 				sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
-				fu.DataOf(f)[0] = sc.Select(n.Left().Object())
+				fu.DataOf(f)[n.Left()] = sc.Select(n.Left().Object())
 				return right, frame.DO
 			}
 			ret = frame.DO