scope.go 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. package std
  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/rt2/scope"
  10. "reflect"
  11. "ypk/assert"
  12. )
  13. type manager struct {
  14. d context.Domain
  15. areas *list.List
  16. }
  17. type KVarea interface {
  18. set(scope.ID, interface{})
  19. get(scope.ID) interface{}
  20. }
  21. type area struct {
  22. root node.Node
  23. x map[scope.ID]interface{}
  24. ready bool
  25. }
  26. func (a *area) set(k scope.ID, v interface{}) {
  27. key := scope.ID{Name: k.Name}
  28. a.x[key] = v
  29. }
  30. func (a *area) get(k scope.ID) interface{} {
  31. key := scope.ID{Name: k.Name}
  32. return a.x[key]
  33. }
  34. type value interface {
  35. set(x interface{})
  36. get() interface{}
  37. }
  38. type reference interface {
  39. id() scope.ID
  40. }
  41. type array interface {
  42. set(i int64, x interface{})
  43. get(i int64) interface{}
  44. upd(x []interface{})
  45. sel() []interface{}
  46. }
  47. type basic struct {
  48. link object.Object
  49. data interface{}
  50. }
  51. type record interface {
  52. setField(field string, x interface{})
  53. getField(field string) interface{}
  54. init(root node.Node)
  55. }
  56. func (b *basic) set(i interface{}) { b.data = i }
  57. func (b *basic) get() interface{} { return b.data }
  58. type ref struct {
  59. link object.Object
  60. ref scope.ID
  61. }
  62. func (r *ref) id() scope.ID { return r.ref }
  63. type arr struct {
  64. link object.Object
  65. par int64
  66. data []interface{}
  67. }
  68. func (a *arr) get(i int64) interface{} {
  69. if len(a.data) == 0 {
  70. a.data = make([]interface{}, a.par)
  71. }
  72. return a.data[i]
  73. }
  74. func (a *arr) set(i int64, x interface{}) {
  75. if len(a.data) == 0 {
  76. a.data = make([]interface{}, a.par)
  77. }
  78. a.data[i] = x
  79. }
  80. func (a *arr) sel() []interface{} { return a.data }
  81. func (a *arr) upd(x []interface{}) { a.data = x }
  82. type rec struct {
  83. link object.Object
  84. root node.Node
  85. x map[scope.ID]interface{}
  86. }
  87. func (r *rec) setField(f string, x interface{}) { r.set(scope.ID{Name: f}, x) }
  88. func (r *rec) getField(f string) interface{} { return r.get(scope.ID{Name: f}) }
  89. func (r *rec) init(n node.Node) {
  90. r.root = n
  91. r.x = make(map[scope.ID]interface{})
  92. }
  93. func (a *rec) set(k scope.ID, v interface{}) { a.x[k] = v }
  94. func (a *rec) get(k scope.ID) interface{} { return a.x[k] }
  95. func nm() scope.Manager {
  96. m := &manager{areas: list.New()}
  97. return m
  98. }
  99. func init() {
  100. scope.New = nm
  101. scope.Designator = design
  102. scope.FindObjByName = FindObjByName
  103. }
  104. func design(n ...node.Node) (id scope.ID) {
  105. switch x := n[0].(type) {
  106. case node.VariableNode, node.ParameterNode:
  107. id = scope.ID{Name: x.Object().Name()}
  108. case node.FieldNode:
  109. if len(n) == 1 {
  110. id = scope.ID{Name: x.Left().Object().Name(), Path: [scope.DEPTH]string{x.Object().Name()}}
  111. } else if n[1] != nil {
  112. id = scope.ID{Name: n[1].Object().Name(), Path: [scope.DEPTH]string{x.Object().Name()}}
  113. } else {
  114. panic("wrong params")
  115. }
  116. case node.IndexNode:
  117. id = scope.ID{Name: x.Left().Object().Name()}
  118. default:
  119. panic(fmt.Sprintln("unsupported", reflect.TypeOf(n)))
  120. }
  121. return id
  122. }
  123. func odesign(o object.Object) (id scope.ID) {
  124. switch x := o.(type) {
  125. case object.VariableObject, object.ParameterObject:
  126. id = scope.ID{Name: x.Name()}
  127. default:
  128. panic(fmt.Sprintln("unsupported", reflect.TypeOf(o)))
  129. }
  130. return id
  131. }
  132. func obj(o object.Object) (key scope.ID, val interface{}) {
  133. switch x := o.(type) {
  134. case object.ConstantObject, object.ProcedureObject, object.TypeObject:
  135. case object.VariableObject, object.FieldObject:
  136. //fmt.Println(x.Name())
  137. key = scope.ID{Name: x.Name()}
  138. switch t := x.Complex().(type) {
  139. case nil:
  140. val = &basic{link: o}
  141. case object.BasicType:
  142. val = &basic{link: o}
  143. case object.ArrayType:
  144. val = &arr{link: o, par: t.Len()}
  145. case object.DynArrayType:
  146. val = &arr{link: o}
  147. case object.RecordType:
  148. val = &rec{link: o}
  149. default:
  150. fmt.Println("unexpected", reflect.TypeOf(t))
  151. }
  152. case object.ParameterObject:
  153. //fmt.Println("'" + x.Name())
  154. key = scope.ID{Name: x.Name()}
  155. val = &ref{link: o}
  156. default:
  157. fmt.Println(reflect.TypeOf(o))
  158. }
  159. return key, val
  160. }
  161. func (m *manager) Allocate(n node.Node, final bool) {
  162. h := &area{ready: final, root: n, x: make(map[scope.ID]interface{})}
  163. mod := rt_mod.DomainModule(m.Domain())
  164. var alloc func(h KVarea, o object.Object)
  165. alloc = func(h KVarea, o object.Object) {
  166. if k, v := obj(o); v != nil {
  167. h.set(k, v)
  168. switch rv := v.(type) {
  169. case record:
  170. rv.init(n)
  171. switch t := o.Complex().(type) {
  172. case object.RecordType:
  173. for rec := t; rec != nil; {
  174. for x := rec.Link(); x != nil; x = x.Link() {
  175. //fmt.Println(o.Name(), ".", x.Name())
  176. alloc(v.(KVarea), x)
  177. }
  178. rec = rec.BaseType()
  179. }
  180. }
  181. }
  182. } else {
  183. //fmt.Println("nil allocated", reflect.TypeOf(o))
  184. }
  185. }
  186. for _, o := range mod.Objects[n] {
  187. alloc(h, o)
  188. }
  189. m.areas.PushFront(h)
  190. //fmt.Println("allocate")
  191. }
  192. func (m *manager) Initialize(n node.Node, o object.Object, _val node.Node) {
  193. e := m.areas.Front()
  194. assert.For(e != nil, 20)
  195. h := e.Value.(*area)
  196. assert.For(h.root == n, 21)
  197. assert.For(!h.ready, 22)
  198. val := _val
  199. //fmt.Println("initialize")
  200. for next := o; next != nil; next = next.Link() {
  201. assert.For(val != nil, 40)
  202. //fmt.Println(reflect.TypeOf(next), next.Name(), ":", next.Type())
  203. //fmt.Println(reflect.TypeOf(val))
  204. switch ov := val.(type) {
  205. case node.ConstantNode:
  206. switch next.(type) {
  207. case object.VariableObject:
  208. m.Update(odesign(next), func(old interface{}) interface{} {
  209. return ov.Data()
  210. })
  211. case object.ParameterObject:
  212. k, v := scope.ID{Name: next.Name()}, &basic{link: o}
  213. h.set(k, v)
  214. m.Update(odesign(next), func(old interface{}) interface{} {
  215. return ov.Data()
  216. })
  217. default:
  218. panic("unknown value")
  219. }
  220. case node.VariableNode, node.ParameterNode:
  221. switch next.(type) {
  222. case object.VariableObject:
  223. m.Update(odesign(next), func(old interface{}) interface{} {
  224. return m.Select(odesign(ov.Object()))
  225. })
  226. case object.ParameterObject:
  227. h.get(scope.ID{Name: next.Name()}).(*ref).ref = design(ov)
  228. }
  229. default:
  230. panic("unknown value")
  231. }
  232. val = val.Link()
  233. }
  234. h.ready = true
  235. }
  236. func (m *manager) Dispose(n node.Node) {
  237. e := m.areas.Front()
  238. if e != nil {
  239. h := e.Value.(*area)
  240. assert.For(h.root == n, 21)
  241. m.areas.Remove(e)
  242. //fmt.Println("dispose")
  243. }
  244. }
  245. func (m *manager) Select(i scope.ID) interface{} {
  246. //fmt.Println("select", i)
  247. depth := 0
  248. type result struct {
  249. x interface{}
  250. }
  251. var res *result
  252. var sel func(interface{}) *result
  253. sel = func(x interface{}) (ret *result) {
  254. switch x := x.(type) {
  255. case value:
  256. ret = &result{x: x.get()}
  257. case reference:
  258. i = x.id()
  259. ret = nil
  260. case array:
  261. if i.Index != nil {
  262. ret = &result{x: x.get(*i.Index)}
  263. } else {
  264. ret = &result{x: x.sel()}
  265. }
  266. case record:
  267. if i.Path[depth] == "" {
  268. ret = &result{x: x.(*rec).link}
  269. } else {
  270. z := x.getField(i.Path[depth])
  271. depth++
  272. ret = sel(z)
  273. }
  274. case nil:
  275. //do nothing
  276. default:
  277. panic(0)
  278. }
  279. return ret
  280. }
  281. for e := m.areas.Front(); (e != nil) && (res == nil); e = e.Next() {
  282. h := e.Value.(*area)
  283. if h.ready {
  284. depth = 0
  285. res = sel(h.get(i))
  286. }
  287. }
  288. assert.For(res != nil, 40)
  289. //fmt.Println(res.x)
  290. return res.x
  291. }
  292. func arrConv(x interface{}) []interface{} {
  293. switch a := x.(type) {
  294. case string:
  295. s := []rune(a)
  296. ret := make([]interface{}, 0)
  297. for i := 0; i < len(s); i++ {
  298. ret = append(ret, s[i])
  299. }
  300. return ret
  301. case []interface{}:
  302. return a
  303. default:
  304. panic(fmt.Sprintln("unsupported", reflect.TypeOf(x)))
  305. }
  306. }
  307. func (m *manager) Update(i scope.ID, val scope.ValueFor) {
  308. assert.For(val != nil, 21)
  309. var x interface{}
  310. fmt.Println("update", i)
  311. depth := 0
  312. var upd func(x interface{}) (ret interface{})
  313. upd = func(x interface{}) (ret interface{}) {
  314. switch x := x.(type) {
  315. case value:
  316. old := x.get()
  317. tmp := val(old)
  318. assert.For(tmp != nil, 40) //если устанавливают значение NIL, значит делают что-то неверно
  319. //fmt.Println(tmp)
  320. x.set(tmp)
  321. ret = x
  322. case reference:
  323. i.Name = x.id().Name
  324. ret = nil
  325. case array:
  326. if i.Index != nil {
  327. old := x.get(*i.Index)
  328. tmp := val(old)
  329. assert.For(tmp != nil, 40) //если устанавливают значение NIL, значит делают что-то неверно
  330. //fmt.Println(tmp)
  331. x.set(*i.Index, tmp)
  332. } else {
  333. old := x.sel()
  334. tmp := val(old)
  335. assert.For(tmp != nil, 40) //если устанавливают значение NIL, значит делают что-то неверно
  336. //fmt.Println(tmp)
  337. x.upd(arrConv(tmp))
  338. }
  339. ret = x
  340. case record:
  341. if i.Path[depth] == "" {
  342. //fmt.Println(i, depth)
  343. panic(0) //случай выбора всей записи целиком
  344. } else {
  345. z := x.getField(i.Path[depth])
  346. depth++
  347. ret = upd(z)
  348. }
  349. case nil:
  350. //do nothing
  351. ret = x
  352. default:
  353. panic(fmt.Sprintln("unhandled", reflect.TypeOf(x)))
  354. }
  355. return ret
  356. }
  357. for e := m.areas.Front(); (e != nil) && (x == nil); e = e.Next() {
  358. h := e.Value.(*area)
  359. depth = 0
  360. x = upd(h.get(i))
  361. }
  362. assert.For(x != nil, 40)
  363. }
  364. func (m *manager) Init(d context.Domain) { m.d = d }
  365. func (m *manager) Domain() context.Domain { return m.d }
  366. func (m *manager) Handle(msg interface{}) {}
  367. func FindObjByName(mgr scope.Manager, name string) (ret object.Object) {
  368. assert.For(name != "", 20)
  369. m := mgr.(*manager)
  370. for e := m.areas.Front(); (e != nil) && (ret == nil); e = e.Next() {
  371. h := e.Value.(*area)
  372. x := h.get(scope.ID{Name: name})
  373. switch x.(type) {
  374. case *basic:
  375. ret = x.(*basic).link
  376. default:
  377. //fmt.Println("no such object")
  378. }
  379. }
  380. return ret
  381. }