field.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. var left node.Node
  17. left, _ = rt2.RegOf(f)[n.Left()].(node.Node)
  18. if left == nil {
  19. left = n.Left()
  20. }
  21. switch l := left.(type) {
  22. case node.VariableNode, node.ParameterNode:
  23. sc := rt2.ScopeFor(f, l.Object().Adr())
  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. rt2.RegOf(f.Parent())[context.META] = n.Object()
  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. rt2.RegOf(f.Parent())[context.META] = rt2.RegOf(in[0].frame)[context.META]
  39. return End()
  40. }
  41. out.next = LATER
  42. case node.GuardNode:
  43. rt2.Push(rt2.New(l), f)
  44. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  45. return rt2.RegOf(f)[n.Left()] != nil, 61
  46. })
  47. out.next = LATER
  48. out.do = fieldSeq
  49. default:
  50. halt.As(100, reflect.TypeOf(l))
  51. }
  52. return out
  53. }