heap.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package std
  2. import (
  3. "fmt"
  4. "fw/cp/node"
  5. "fw/cp/object"
  6. "fw/rt2/context"
  7. "fw/rt2/scope"
  8. "reflect"
  9. "ypk/assert"
  10. )
  11. type heap struct {
  12. d context.Domain
  13. data *area
  14. next int
  15. }
  16. type desc struct {
  17. scope.ID
  18. link object.Object
  19. }
  20. func (d *desc) Object() object.Object {
  21. return d.link
  22. }
  23. func nh() scope.Manager {
  24. return &heap{data: &area{ready: true, root: nil, x: make(map[scope.ID]interface{})}}
  25. }
  26. func (h *heap) String() (ret string) {
  27. ret = fmt.Sprintln("HEAP")
  28. ret = fmt.Sprintln(ret, h.data)
  29. return fmt.Sprint(ret, "END")
  30. }
  31. func (h *heap) Allocate(n node.Node, par ...interface{}) (ret scope.ValueFor) {
  32. var talloc func(t object.PointerType) (oid scope.ID)
  33. talloc = func(t object.PointerType) (oid scope.ID) {
  34. switch bt := t.Base().(type) {
  35. case object.RecordType:
  36. fake := object.New(object.VARIABLE)
  37. fake.SetComplex(bt)
  38. fake.SetType(object.COMPLEX)
  39. fake.SetName("@")
  40. r := &rec{link: fake}
  41. oid = scope.ID{Name: "@"}
  42. oid.Ref = new(int)
  43. *oid.Ref = h.next
  44. od := &desc{link: fake}
  45. od.ID = oid
  46. fake.SetRef(od)
  47. alloc(nil, h.data, oid, r)
  48. case object.DynArrayType:
  49. assert.For(len(par) > 0, 20)
  50. var p int64
  51. switch x := par[0].(type) {
  52. case int64:
  53. p = x
  54. case int32:
  55. p = int64(x)
  56. default:
  57. panic("mistyped parameter")
  58. }
  59. fake := object.New(object.VARIABLE)
  60. fake.SetComplex(bt)
  61. fake.SetType(object.COMPLEX)
  62. fake.SetName("@")
  63. r := &arr{link: fake, par: p}
  64. oid = scope.ID{Name: "@"}
  65. oid.Ref = new(int)
  66. *oid.Ref = h.next
  67. od := &desc{link: fake}
  68. od.ID = oid
  69. fake.SetRef(od)
  70. alloc(nil, h.data, oid, r)
  71. case object.ArrayType:
  72. panic(0)
  73. case object.PointerType:
  74. oid = talloc(bt)
  75. default:
  76. panic(fmt.Sprintln("cannot allocate", reflect.TypeOf(bt)))
  77. }
  78. return oid
  79. }
  80. switch v := n.(type) {
  81. case node.VariableNode:
  82. switch t := v.Object().Complex().(type) {
  83. case object.PointerType:
  84. h.next++
  85. oid := talloc(t)
  86. return func(interface{}) interface{} {
  87. return oid
  88. }
  89. default:
  90. panic(fmt.Sprintln("unsupported type", reflect.TypeOf(t)))
  91. }
  92. default:
  93. panic(fmt.Sprintln("unsupported node", reflect.TypeOf(v)))
  94. }
  95. }
  96. func (h *heap) Dispose(n node.Node) {
  97. }
  98. func (h *heap) Target(...scope.Allocator) scope.Allocator {
  99. return h
  100. }
  101. func (h *heap) Update(i scope.ID, val scope.ValueFor) {
  102. fmt.Println("update", i)
  103. var upd func(x interface{}) (ret interface{})
  104. upd = func(x interface{}) (ret interface{}) {
  105. fmt.Println(reflect.TypeOf(x))
  106. switch x := x.(type) {
  107. case value:
  108. old := x.get()
  109. tmp := val(old)
  110. assert.For(tmp != nil, 40) //если устанавливают значение NIL, значит делают что-то неверно
  111. //fmt.Println(tmp)
  112. x.set(tmp)
  113. ret = x
  114. case record:
  115. if i.Path == "" {
  116. //fmt.Println(i, depth)
  117. panic(0) //случай выбора всей записи целиком
  118. } else {
  119. z := x.getField(i.Path)
  120. ret = upd(z)
  121. }
  122. case array:
  123. if i.Index != nil {
  124. old := x.get(*i.Index)
  125. tmp := val(old)
  126. assert.For(tmp != nil, 40) //если устанавливают значение NIL, значит делают что-то неверно
  127. //fmt.Println(tmp)
  128. x.set(*i.Index, tmp)
  129. } else {
  130. old := x.sel()
  131. tmp := val(old)
  132. assert.For(tmp != nil, 40) //если устанавливают значение NIL, значит делают что-то неверно
  133. //fmt.Println(tmp)
  134. x.upd(arrConv(tmp))
  135. }
  136. ret = x
  137. default:
  138. panic(0)
  139. }
  140. return ret
  141. }
  142. upd(h.data.get(i))
  143. }
  144. func (h *heap) Select(i scope.ID) interface{} {
  145. fmt.Println("heap select", i)
  146. type result struct {
  147. x interface{}
  148. }
  149. var res *result
  150. var sel func(interface{}) *result
  151. sel = func(x interface{}) (ret *result) {
  152. fmt.Println(x)
  153. switch x := x.(type) {
  154. case record:
  155. if i.Path == "" {
  156. ret = &result{x: x.(*rec).link}
  157. } else {
  158. z := x.getField(i.Path)
  159. ret = sel(z)
  160. }
  161. case array:
  162. if i.Index != nil {
  163. ret = &result{x: x.get(*i.Index)}
  164. } else {
  165. ret = &result{x: x.sel()}
  166. }
  167. default:
  168. panic(0)
  169. }
  170. return ret
  171. }
  172. res = sel(h.data.get(i))
  173. assert.For(res != nil, 40)
  174. //fmt.Println(res.x)
  175. return res.x
  176. }
  177. func (h *heap) Init(d context.Domain) { h.d = d }
  178. func (h *heap) Domain() context.Domain { return h.d }
  179. func (h *heap) Handle(msg interface{}) {}