12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- package rules
- import (
- "reflect"
- )
- import (
- "fw/cp/node"
- "fw/rt2"
- "fw/rt2/context"
- "fw/rt2/frame"
- "fw/rt2/scope"
- "ypk/halt"
- )
- func fieldSeq(in ...IN) (out OUT) {
- f := in[0].frame
- n := rt2.NodeOf(f)
- sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
- var left node.Node
- left, _ = rt2.RegOf(f)[n.Left()].(node.Node)
- if left == nil {
- left = n.Left()
- }
- switch l := left.(type) {
- case node.VariableNode, node.ParameterNode:
- sc.Select(l.Object().Adr(), func(v scope.Value) {
- rt2.ValueOf(f.Parent())[n.Adr()] = v.(scope.Record).Get(n.Object().Adr())
- //fmt.Println(n.Object().Adr())
- })
- out = End()
- case node.FieldNode, node.DerefNode:
- rt2.Push(rt2.New(l), f)
- rt2.Assert(f, func(f frame.Frame) (bool, int) {
- _, ok := rt2.ValueOf(f)[l.Adr()].(scope.Record)
- return ok, 60
- })
- out.do = func(in ...IN) OUT {
- v := rt2.ValueOf(in[0].frame)[l.Adr()].(scope.Record)
- rt2.ValueOf(f.Parent())[n.Adr()] = v.Get(n.Object().Adr())
- return End()
- }
- out.next = LATER
- case node.GuardNode:
- rt2.Push(rt2.New(l), f)
- rt2.Assert(f, func(f frame.Frame) (bool, int) {
- return rt2.RegOf(f)[n.Left()] != nil, 61
- })
- out.next = LATER
- out.do = fieldSeq
- default:
- halt.As(100, reflect.TypeOf(l))
- }
- return out
- }
|