deref.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package rules
  2. import (
  3. "fw/cp/node"
  4. "fw/cp/object"
  5. "fw/cp/traps"
  6. "fw/rt2"
  7. "fw/rt2/context"
  8. "fw/rt2/frame"
  9. "fw/rt2/scope"
  10. "reflect"
  11. "ypk/assert"
  12. "ypk/halt"
  13. )
  14. func derefSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  15. n := rt2.NodeOf(f).(node.DerefNode)
  16. if n.Ptr() {
  17. switch l := n.Left().(type) {
  18. case node.ParameterNode, node.VariableNode:
  19. sc := rt2.ScopeFor(f, l.Object().Adr())
  20. sc.Select(l.Object().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. rt2.RegOf(f.Parent())[context.META] = l.Object()
  25. if scope.GoTypeFrom(ptr.Get()) == nil {
  26. seq, ret = doTrap(f, traps.NILderef)
  27. } else {
  28. seq, ret = frame.End()
  29. }
  30. })
  31. return seq, ret
  32. case node.IndexNode:
  33. return This(expectExpr(f, l, func(...IN) (out OUT) {
  34. v := rt2.ValueOf(f)[l.Adr()]
  35. ptr, ok := v.(scope.Pointer)
  36. assert.For(ok, 60, reflect.TypeOf(v))
  37. rt2.ValueOf(f.Parent())[n.Adr()] = ptr.Get()
  38. rt2.RegOf(f.Parent())[context.META] = rt2.RegOf(f)[context.META]
  39. if scope.GoTypeFrom(ptr.Get()) == nil {
  40. out = thisTrap(f, traps.NILderef)
  41. } else {
  42. out = End()
  43. }
  44. return
  45. }))
  46. case node.FieldNode, node.CallNode:
  47. rt2.Push(rt2.New(l), f)
  48. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  49. return rt2.ValueOf(f)[l.Adr()] != nil || rt2.RegOf(f)[context.RETURN] != nil, 63
  50. })
  51. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  52. v := rt2.ValueOf(f)[l.Adr()]
  53. if v == nil {
  54. v = rt2.RegOf(f)[context.RETURN].(scope.Value)
  55. }
  56. ptr, ok := v.(scope.Pointer)
  57. assert.For(ok, 60, reflect.TypeOf(v))
  58. rt2.ValueOf(f.Parent())[n.Adr()] = ptr.Get()
  59. rt2.RegOf(f.Parent())[context.META] = rt2.RegOf(f)[context.META]
  60. if scope.GoTypeFrom(ptr.Get()) == nil {
  61. seq, ret = doTrap(f, traps.NILderef)
  62. } else {
  63. seq, ret = frame.End()
  64. }
  65. return frame.End()
  66. }
  67. ret = frame.LATER
  68. return seq, ret
  69. default:
  70. halt.As(100, l.Adr(), reflect.TypeOf(l))
  71. }
  72. } else {
  73. deref := func(val scope.Value) {
  74. t, c := scope.Ops.TypeOf(val)
  75. switch cc := c.(type) {
  76. case object.ArrayType:
  77. rt2.ValueOf(f.Parent())[n.Adr()] = scope.TypeFromGo(scope.GoTypeFrom(val))
  78. case object.DynArrayType:
  79. rt2.ValueOf(f.Parent())[n.Adr()] = scope.TypeFromGo(scope.GoTypeFrom(val))
  80. //case nil:
  81. // panic(0)
  82. default:
  83. halt.As(100, t, reflect.TypeOf(cc))
  84. }
  85. }
  86. if n.Left().Object() != nil {
  87. switch l := n.Left().Object().(type) {
  88. case object.ParameterObject, object.VariableObject:
  89. sc := rt2.ScopeFor(f, l.Adr())
  90. val := sc.Select(l.Adr())
  91. rt2.RegOf(f.Parent())[context.META] = l
  92. deref(val)
  93. return frame.End()
  94. default:
  95. halt.As(100, l.Adr(), reflect.TypeOf(l))
  96. }
  97. } else {
  98. switch left := n.Left().(type) {
  99. case node.DerefNode:
  100. rt2.Push(rt2.New(left), f)
  101. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  102. return rt2.ValueOf(f)[left.Adr()] != nil, 60
  103. })
  104. seq = Propose(func(...IN) OUT {
  105. deref(rt2.ValueOf(f)[left.Adr()])
  106. rt2.RegOf(f.Parent())[context.META] = rt2.RegOf(f)[context.META]
  107. return End()
  108. })
  109. ret = LATER.wait()
  110. case node.IndexNode:
  111. rt2.Push(rt2.New(left), f)
  112. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  113. return rt2.ValueOf(f)[left.Adr()] != nil, 60
  114. })
  115. seq = Propose(func(...IN) OUT {
  116. val := rt2.ValueOf(f)[left.Adr()]
  117. sc := rt2.ScopeFor(f, left.Left().Object().Adr())
  118. arr := sc.Select(left.Left().Object().Adr()).(scope.Array)
  119. rt2.RegOf(f.Parent())[context.META] = left.Object()
  120. deref(arr.Get(val).(scope.Pointer).Get())
  121. //rt2.ValueOf(f.Parent())[n.Adr()] = rt2.ValueOf(f)[left.Adr()]
  122. //halt.As(100, reflect.TypeOf(rt2.ValueOf(f)[left.Adr()]))
  123. return End()
  124. })
  125. ret = LATER.wait()
  126. default:
  127. halt.As(100, reflect.TypeOf(left))
  128. }
  129. }
  130. }
  131. /* if ok {
  132. // rt2.DataOf(f.Parent())[n] = scope.Designator(n.Left())
  133. } else {
  134. for z := n.Left(); !ok && z != nil; {
  135. switch z.(type) {
  136. case node.DerefNode:
  137. z = z.Left()
  138. default:
  139. data := sc.Select(z.Adr())
  140. assert.For(data != nil, 40)
  141. rt2.DataOf(f.Parent())[n] = data
  142. ok = true
  143. }
  144. }
  145. } */
  146. return seq, ret
  147. }