1
0

scope.go 9.5 KB

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