deref.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package rules
  2. import (
  3. "fw/cp/node"
  4. "fw/cp/object"
  5. "fw/rt2"
  6. "fw/rt2/context"
  7. "fw/rt2/frame"
  8. "fw/rt2/scope"
  9. "reflect"
  10. "ypk/assert"
  11. "ypk/halt"
  12. )
  13. func derefSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  14. n := rt2.NodeOf(f).(node.DerefNode)
  15. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  16. //fmt.Println("deref from ptr", n.Ptr())
  17. if n.Ptr() {
  18. switch l := n.Left().Object().(type) {
  19. case object.ParameterObject, object.VariableObject:
  20. sc.Select(l.Adr(), func(v scope.Value) {
  21. ptr, ok := v.(scope.Pointer)
  22. assert.For(ok, 60, reflect.TypeOf(v))
  23. rt2.ValueOf(f.Parent())[n.Adr()] = ptr.Get()
  24. })
  25. return frame.End()
  26. default:
  27. halt.As(100, l.Adr(), reflect.TypeOf(l))
  28. }
  29. } else {
  30. if n.Left().Object() != nil {
  31. switch l := n.Left().Object().(type) {
  32. case object.ParameterObject, object.VariableObject:
  33. rt2.ValueOf(f.Parent())[n.Adr()] = sc.Select(l.Adr())
  34. return frame.End()
  35. default:
  36. halt.As(100, l.Adr(), reflect.TypeOf(l))
  37. }
  38. } else {
  39. switch left := n.Left().(type) {
  40. case node.DerefNode:
  41. rt2.Push(rt2.New(left), f)
  42. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  43. return rt2.ValueOf(f)[left.Adr()] != nil, 60
  44. })
  45. seq = Propose(func(...IN) OUT {
  46. rt2.ValueOf(f.Parent())[n.Adr()] = rt2.ValueOf(f)[left.Adr()]
  47. return End()
  48. })
  49. ret = LATER.wait()
  50. default:
  51. halt.As(100, reflect.TypeOf(left))
  52. }
  53. }
  54. }
  55. /* if ok {
  56. // rt2.DataOf(f.Parent())[n] = scope.Designator(n.Left())
  57. } else {
  58. for z := n.Left(); !ok && z != nil; {
  59. switch z.(type) {
  60. case node.DerefNode:
  61. z = z.Left()
  62. default:
  63. data := sc.Select(z.Adr())
  64. assert.For(data != nil, 40)
  65. rt2.DataOf(f.Parent())[n] = data
  66. ok = true
  67. }
  68. }
  69. } */
  70. return seq, ret
  71. }