field.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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. //fmt.Println(n.Object().Adr())
  27. })
  28. out = End()
  29. case node.FieldNode, node.DerefNode:
  30. rt2.Push(rt2.New(l), f)
  31. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  32. _, ok := rt2.ValueOf(f)[l.Adr()].(scope.Record)
  33. return ok, 60
  34. })
  35. out.do = func(in ...IN) OUT {
  36. v := rt2.ValueOf(in[0].frame)[l.Adr()].(scope.Record)
  37. rt2.ValueOf(f.Parent())[n.Adr()] = v.Get(n.Object().Adr())
  38. return End()
  39. }
  40. out.next = LATER
  41. case node.GuardNode:
  42. rt2.Push(rt2.New(l), f)
  43. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  44. return rt2.RegOf(f)[n.Left()] != nil, 61
  45. })
  46. out.next = LATER
  47. out.do = fieldSeq
  48. default:
  49. halt.As(100, reflect.TypeOf(l))
  50. }
  51. return out
  52. }