field.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package rules
  2. import (
  3. "reflect"
  4. )
  5. import (
  6. "fw/cp/node"
  7. "fw/rt2"
  8. "fw/rt2/context"
  9. "fw/rt2/frame"
  10. "fw/rt2/scope"
  11. "ypk/halt"
  12. )
  13. func fieldSeq(in ...IN) (out OUT) {
  14. f := in[0].frame
  15. n := rt2.NodeOf(f)
  16. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  17. var left node.Node
  18. left, _ = rt2.RegOf(f)[n.Left()].(node.Node)
  19. if left == nil {
  20. left = n.Left()
  21. }
  22. switch l := left.(type) {
  23. case node.VariableNode, node.ParameterNode:
  24. sc.Select(l.Object().Adr(), func(v scope.Value) {
  25. rt2.ValueOf(f.Parent())[n.Adr()] = v.(scope.Record).Get(n.Object().Adr())
  26. })
  27. out = End()
  28. case node.FieldNode, node.DerefNode:
  29. rt2.Push(rt2.New(l), f)
  30. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  31. _, ok := rt2.ValueOf(f)[l.Adr()].(scope.Record)
  32. return ok, 60
  33. })
  34. out.do = func(in ...IN) OUT {
  35. v := rt2.ValueOf(in[0].frame)[l.Adr()].(scope.Record)
  36. rt2.ValueOf(f.Parent())[n.Adr()] = v.Get(n.Object().Adr())
  37. return End()
  38. }
  39. out.next = LATER
  40. case node.GuardNode:
  41. rt2.Push(rt2.New(l), f)
  42. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  43. return rt2.RegOf(f)[n.Left()] != nil, 61
  44. })
  45. out.next = LATER
  46. out.do = fieldSeq
  47. default:
  48. halt.As(100, reflect.TypeOf(l))
  49. }
  50. return out
  51. }