scope.go 10 KB

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