1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- 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)
- 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 := rt2.ScopeFor(f, l.Object().Adr())
- sc.Select(l.Object().Adr(), func(v scope.Value) {
- rt2.ValueOf(f.Parent())[n.Adr()] = v.(scope.Record).Get(n.Object().Adr())
- rt2.RegOf(f.Parent())[context.META] = n.Object()
- })
- 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())
- rt2.RegOf(f.Parent())[context.META] = rt2.RegOf(in[0].frame)[context.META]
- 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
- }
|