stdScope.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. package scope
  2. import (
  3. "container/list"
  4. "fmt"
  5. "fw/cp/node"
  6. "fw/cp/object"
  7. "fw/rt2/context"
  8. rt_mod "fw/rt2/module"
  9. "fw/utils"
  10. "math/rand"
  11. "reflect"
  12. "strconv"
  13. "ypk/assert"
  14. )
  15. func Id(of interface{}) (ret string) {
  16. assert.For(of != nil, 20)
  17. switch of.(type) {
  18. case object.Object:
  19. fmt.Println("id", of.(object.Object).Name(), reflect.TypeOf(of))
  20. //panic("fuck objects, use nodes")
  21. ret = of.(object.Object).Name()
  22. default:
  23. fmt.Println(reflect.TypeOf(of))
  24. panic("cannot identify")
  25. }
  26. assert.For(ret != "", 60)
  27. return ret
  28. }
  29. func This(i interface{}) Manager {
  30. assert.For(i != nil, 20)
  31. return i.(Manager)
  32. }
  33. func New() Manager {
  34. return new(manager).init()
  35. }
  36. type manager struct {
  37. d context.Domain
  38. areas *list.List
  39. opts struct {
  40. startFromArea *area
  41. }
  42. }
  43. type area struct {
  44. heap map[string]value
  45. cache map[string]object.Object
  46. root node.Node
  47. ready bool
  48. }
  49. type value interface {
  50. Set(x interface{})
  51. Get() interface{}
  52. }
  53. type direct struct {
  54. value
  55. data interface{}
  56. }
  57. type indirect struct {
  58. value
  59. ref object.Object
  60. mgr *manager
  61. area *area
  62. }
  63. // маскирует объект-параметр
  64. type mask struct {
  65. object.Object
  66. id int
  67. }
  68. func nextMask() int {
  69. return rand.Int()
  70. }
  71. type dummy struct{}
  72. var def *dummy = &dummy{}
  73. func (v *direct) Set(x interface{}) {
  74. assert.For(x != nil, 20)
  75. v.data = x
  76. utils.Println("set", x, reflect.TypeOf(x))
  77. }
  78. func (v *direct) Get() interface{} { return v.data }
  79. func (v *indirect) Set(x interface{}) {
  80. assert.For(x != nil, 20)
  81. assert.For(v.ref != nil, 21)
  82. v.mgr.Update(Id(v.ref), func(old interface{}) interface{} {
  83. return x
  84. })
  85. }
  86. func (v *indirect) Get() (ret interface{}) {
  87. assert.For(v.ref != nil, 20)
  88. _, ok := v.ref.(*mask)
  89. if !ok {
  90. v.mgr.opts.startFromArea = v.area
  91. }
  92. ret = v.mgr.Select(Id(v.ref))
  93. v.mgr.opts.startFromArea = nil
  94. return ret
  95. }
  96. func (m *manager) init() *manager {
  97. m.areas = list.New()
  98. return m
  99. }
  100. func (m *manager) Allocate(n node.Node, final bool) {
  101. mod := rt_mod.DomainModule(m.Domain())
  102. h := new(area)
  103. h.ready = final
  104. h.heap = make(map[string]value)
  105. h.cache = make(map[string]object.Object)
  106. h.root = n
  107. for _, o := range mod.Objects[n] {
  108. //fmt.Println(reflect.TypeOf(o))
  109. switch o.(type) {
  110. case object.VariableObject:
  111. switch o.(object.VariableObject).Type() {
  112. case object.COMPLEX:
  113. switch o.(object.VariableObject).Complex().(type) {
  114. case object.RecordType:
  115. for rec := o.(object.VariableObject).Complex().(object.RecordType); rec != nil; {
  116. for x := rec.Link(); x != nil; x = x.Link() {
  117. fmt.Println(o.Name(), ".", x.Name())
  118. }
  119. if rec.Base() != "" {
  120. rec = mod.TypeByName(n, rec.Base()).(object.RecordType)
  121. } else {
  122. rec = nil
  123. }
  124. }
  125. default:
  126. h.heap[Id(o)] = &direct{data: def}
  127. h.cache[Id(o)] = o
  128. }
  129. default:
  130. h.heap[Id(o)] = &direct{data: def}
  131. h.cache[Id(o)] = o
  132. }
  133. case object.ParameterObject:
  134. h.heap[Id(o)] = &indirect{mgr: m, area: h}
  135. h.cache[Id(o)] = o
  136. default:
  137. fmt.Println("wrong object type", reflect.TypeOf(o))
  138. }
  139. }
  140. m.areas.PushFront(h)
  141. fmt.Println("allocate", len(h.heap), "obj")
  142. }
  143. func (m *manager) set(a *area, o object.Object, val node.Node) {
  144. switch val.(type) {
  145. case node.ConstantNode:
  146. switch o.(type) {
  147. case object.VariableObject:
  148. m.Update(Id(o), func(old interface{}) interface{} {
  149. return val.(node.ConstantNode).Data()
  150. })
  151. case object.ParameterObject:
  152. assert.For(a.heap[Id(o)].(*indirect).ref == nil, 40)
  153. m := &mask{id: nextMask()}
  154. a.heap[Id(o)].(*indirect).ref = m
  155. a.heap[Id(m)] = &direct{data: val.(node.ConstantNode).Data()}
  156. default:
  157. panic("unknown value")
  158. }
  159. case node.VariableNode, node.ParameterNode:
  160. switch o.(type) {
  161. case object.VariableObject:
  162. m.Update(Id(o), func(old interface{}) interface{} {
  163. return m.Select(Id(val.Object()))
  164. })
  165. case object.ParameterObject:
  166. a.heap[Id(o)].(*indirect).ref = val.Object()
  167. fmt.Println(val.Object())
  168. }
  169. default:
  170. panic("unknown value")
  171. }
  172. }
  173. func (m *manager) Initialize(n node.Node, o object.Object, _val node.Node) {
  174. e := m.areas.Front()
  175. assert.For(e != nil, 20)
  176. h := e.Value.(*area)
  177. assert.For(h.root == n, 21)
  178. assert.For(!h.ready, 22)
  179. val := _val
  180. fmt.Println("initialize")
  181. for next := o; next != nil; next = next.Link() {
  182. assert.For(val != nil, 40)
  183. fmt.Println(reflect.TypeOf(next), next.Name(), ":", next.Type())
  184. fmt.Println(reflect.TypeOf(val))
  185. m.set(h, next, val)
  186. val = val.Link()
  187. }
  188. h.ready = true
  189. }
  190. func (m *manager) Dispose(n node.Node) {
  191. e := m.areas.Front()
  192. if e != nil {
  193. h := e.Value.(*area)
  194. assert.For(h.root == n, 21)
  195. m.areas.Remove(e)
  196. fmt.Println("dispose")
  197. }
  198. }
  199. func FindObjByName(mgr Manager, name string) (ret object.Object) {
  200. assert.For(name != "", 20)
  201. m := mgr.(*manager)
  202. for e := m.areas.Front(); (e != nil) && (ret == nil); e = e.Next() {
  203. h := e.Value.(*area)
  204. ret = h.cache[name]
  205. }
  206. return ret
  207. }
  208. func (m *manager) Select(id string) (ret interface{}) {
  209. assert.For(id != "", 20)
  210. for e := m.areas.Front(); (e != nil) && (ret == nil); e = e.Next() {
  211. h := e.Value.(*area)
  212. if (h != m.opts.startFromArea) && h.ready {
  213. ret = h.heap[id]
  214. }
  215. }
  216. assert.For(ret != nil, 40)
  217. ret = ret.(value).Get()
  218. if _, ok := ret.(*dummy); ok {
  219. ret = nil
  220. }
  221. return ret
  222. }
  223. func (m *manager) Update(id string, val ValueFor) {
  224. assert.For(id != "", 20)
  225. assert.For(val != nil, 21)
  226. var x *area
  227. for e := m.areas.Front(); (e != nil) && (x == nil); e = e.Next() {
  228. h := e.Value.(*area)
  229. if h.heap[id] != nil {
  230. x = h
  231. }
  232. }
  233. assert.For(x != nil, 40)
  234. old := x.heap[id].Get()
  235. if old == def {
  236. old = nil
  237. }
  238. tmp := val(old)
  239. assert.For(tmp != nil, 40) //если устанавливают значение NIL, значит делают что-то неверно
  240. x.heap[id].Set(tmp)
  241. }
  242. func (m *manager) Init(d context.Domain) {
  243. m.d = d
  244. }
  245. func (m *manager) Domain() context.Domain {
  246. return m.d
  247. }
  248. func (m *manager) Handle(msg interface{}) {}
  249. func (m *mask) Name() string { return strconv.Itoa(m.id) }