scope.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  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) 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(x ...scope.ID) scope.ID {
  69. if len(x) == 1 {
  70. r.ref = x[0]
  71. } else if len(x) > 1 {
  72. panic("there can be only one")
  73. }
  74. return r.ref
  75. }
  76. type arr struct {
  77. link object.Object
  78. par int64
  79. data []interface{}
  80. }
  81. func (a *arr) get(i int64) interface{} {
  82. if len(a.data) == 0 {
  83. a.data = make([]interface{}, a.par)
  84. }
  85. return a.data[i]
  86. }
  87. func (a *arr) set(i int64, x interface{}) {
  88. if len(a.data) == 0 {
  89. a.data = make([]interface{}, a.par)
  90. }
  91. a.data[i] = x
  92. }
  93. func (a *arr) sel() []interface{} { return a.data }
  94. func (a *arr) upd(x []interface{}) { a.data = x }
  95. type rec struct {
  96. link object.Object
  97. root node.Node
  98. x map[scope.ID]interface{}
  99. }
  100. func (r *rec) setField(f string, x interface{}) { r.set(scope.ID{Name: f}, x) }
  101. func (r *rec) getField(f string) interface{} { return r.get(scope.ID{Name: f}) }
  102. func (r *rec) init(n node.Node) {
  103. r.root = n
  104. r.x = make(map[scope.ID]interface{})
  105. }
  106. func (a *rec) set(k scope.ID, v interface{}) { a.x[k] = v }
  107. func (a *rec) get(k scope.ID) interface{} { return a.x[k] }
  108. func nm() scope.Manager {
  109. m := &manager{areas: list.New()}
  110. return m
  111. }
  112. func init() {
  113. scope.NewStack = nm
  114. scope.Designator = design
  115. scope.FindObjByName = FindObjByName
  116. scope.NewHeap = nh
  117. }
  118. func design(n ...node.Node) (id scope.ID) {
  119. switch x := n[0].(type) {
  120. case node.VariableNode, node.ParameterNode:
  121. id = scope.ID{Name: x.Object().Name()}
  122. case node.FieldNode:
  123. fmt.Println(x.Object().Name())
  124. if len(n) == 1 {
  125. id = scope.ID{Name: x.Left().Object().Name(), Path: x.Object().Name()}
  126. } else if n[1] != nil {
  127. id = scope.ID{Name: n[1].Object().Name(), Path: x.Object().Name()}
  128. } else {
  129. panic("wrong params")
  130. }
  131. case node.IndexNode:
  132. id = scope.ID{Name: x.Left().Object().Name()}
  133. default:
  134. panic(fmt.Sprintln("unsupported", reflect.TypeOf(n)))
  135. }
  136. return id
  137. }
  138. func odesign(o object.Object) (id scope.ID) {
  139. switch x := o.(type) {
  140. case object.VariableObject, object.ParameterObject:
  141. switch x.Name() {
  142. case "@":
  143. id = scope.ID{Name: "@", Ref: new(int)}
  144. *id.Ref = *x.Ref()[0].(*desc).Ref
  145. default:
  146. id = scope.ID{Name: x.Name()}
  147. }
  148. default:
  149. panic(fmt.Sprintln("unsupported", reflect.TypeOf(o)))
  150. }
  151. return id
  152. }
  153. func obj(o object.Object) (key scope.ID, val interface{}) {
  154. switch x := o.(type) {
  155. case object.ConstantObject, object.ProcedureObject, object.TypeObject:
  156. case object.VariableObject, object.FieldObject:
  157. //fmt.Println(x.Name())
  158. key = scope.ID{Name: x.Name()}
  159. switch t := x.Complex().(type) {
  160. case nil:
  161. val = &basic{link: o}
  162. case object.BasicType:
  163. val = &basic{link: o}
  164. case object.ArrayType:
  165. val = &arr{link: o, par: t.Len()}
  166. case object.DynArrayType:
  167. val = &arr{link: o}
  168. case object.RecordType:
  169. val = &rec{link: o}
  170. case object.PointerType:
  171. val = &ref{link: o, ref: scope.ID{Ref: new(int)}}
  172. default:
  173. fmt.Println("unexpected", reflect.TypeOf(t))
  174. }
  175. case object.ParameterObject:
  176. //fmt.Println("'" + x.Name())
  177. key = scope.ID{Name: x.Name()}
  178. val = &ref{link: o}
  179. default:
  180. fmt.Println(reflect.TypeOf(o))
  181. }
  182. return key, val
  183. }
  184. func alloc(root node.Node, h KVarea, k scope.ID, v interface{}) {
  185. h.set(k, v)
  186. switch rv := v.(type) {
  187. case record:
  188. rv.init(root)
  189. o := rv.(*rec).link
  190. switch t := o.Complex().(type) {
  191. case object.RecordType:
  192. for rec := t; rec != nil; {
  193. for x := rec.Link(); x != nil; x = x.Link() {
  194. //fmt.Println(o.Name(), ".", x.Name())
  195. k, f := obj(x)
  196. alloc(root, v.(KVarea), k, f)
  197. }
  198. rec = rec.BaseType()
  199. }
  200. }
  201. }
  202. }
  203. func (m *manager) Target(...scope.Allocator) scope.Allocator {
  204. return m
  205. }
  206. func (m *manager) Allocate(n node.Node, final bool) {
  207. h := &area{ready: final, root: n, x: make(map[scope.ID]interface{})}
  208. runtime.SetFinalizer(h, area_fin)
  209. mod := rt_mod.DomainModule(m.Domain())
  210. for _, o := range mod.Objects[n] {
  211. k, v := obj(o)
  212. //fmt.Println(k, v)
  213. alloc(n, h, k, v)
  214. }
  215. m.areas.PushFront(h)
  216. fmt.Println("allocate")
  217. }
  218. func (m *manager) Initialize(n node.Node, par scope.PARAM) (seq frame.Sequence, ret frame.WAIT) {
  219. e := m.areas.Front()
  220. assert.For(e != nil, 20)
  221. h := e.Value.(*area)
  222. assert.For(h.root == n, 21)
  223. assert.For(!h.ready, 22)
  224. val := par.Values
  225. fmt.Println("initialize")
  226. f := par.Frame
  227. end := func(frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  228. h.ready = true
  229. if par.Tail != nil {
  230. return par.Tail(f)
  231. } else {
  232. return frame.End()
  233. }
  234. }
  235. seq = end
  236. ret = frame.NOW
  237. for next := par.Objects; next != nil; next = next.Link() {
  238. assert.For(val != nil, 40)
  239. fmt.Println(reflect.TypeOf(next), next.Name(), ":", next.Type())
  240. fmt.Println(reflect.TypeOf(val))
  241. switch ov := val.(type) {
  242. case node.ConstantNode:
  243. switch next.(type) {
  244. case object.VariableObject:
  245. m.Update(odesign(next), func(old interface{}) interface{} {
  246. return ov.Data()
  247. })
  248. case object.ParameterObject:
  249. k, v := scope.ID{Name: next.Name()}, &basic{link: next}
  250. h.set(k, v)
  251. m.Update(odesign(next), func(old interface{}) interface{} {
  252. return ov.Data()
  253. })
  254. default:
  255. panic("unknown value")
  256. }
  257. case node.VariableNode, node.ParameterNode:
  258. switch next.(type) {
  259. case object.VariableObject:
  260. m.Update(odesign(next), func(old interface{}) interface{} {
  261. return m.Select(odesign(ov.Object()))
  262. })
  263. case object.ParameterObject:
  264. h.get(scope.ID{Name: next.Name()}).(*ref).ref = design(ov)
  265. default:
  266. panic("unknown value")
  267. }
  268. case node.DerefNode:
  269. rt2.Push(rt2.New(ov), f)
  270. dn := next
  271. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  272. fmt.Println(rt2.DataOf(f)[ov])
  273. switch dn.(type) {
  274. case object.VariableObject:
  275. m.Update(odesign(dn), func(old interface{}) interface{} {
  276. return rt2.DataOf(f)[ov]
  277. })
  278. case object.ParameterObject:
  279. h.get(scope.ID{Name: dn.Name()}).(*ref).ref = odesign(rt2.DataOf(f)[ov].(object.Object))
  280. fmt.Println("got param", odesign(rt2.DataOf(f)[ov].(object.Object)))
  281. default:
  282. panic(fmt.Sprintln("unknown value", reflect.TypeOf(next)))
  283. }
  284. return end, frame.NOW
  285. }
  286. ret = frame.LATER
  287. default:
  288. panic(fmt.Sprintln("unknown value", reflect.TypeOf(val)))
  289. }
  290. val = val.Link()
  291. }
  292. return seq, ret
  293. }
  294. func (m *manager) Dispose(n node.Node) {
  295. e := m.areas.Front()
  296. if e != nil {
  297. h := e.Value.(*area)
  298. assert.For(h.root == n, 21)
  299. m.areas.Remove(e)
  300. //fmt.Println("dispose")
  301. }
  302. }
  303. func (m *manager) Select(i scope.ID) interface{} {
  304. type result struct {
  305. x interface{}
  306. }
  307. var res *result
  308. var sel func(interface{}) *result
  309. fmt.Println(i)
  310. sel = func(x interface{}) (ret *result) {
  311. switch x := x.(type) {
  312. case value:
  313. ret = &result{x: x.get()}
  314. case reference:
  315. i = x.id()
  316. fmt.Println("ref!", i)
  317. ret = nil
  318. case array:
  319. if i.Index != nil {
  320. ret = &result{x: x.get(*i.Index)}
  321. } else {
  322. ret = &result{x: x.sel()}
  323. }
  324. case record:
  325. if i.Path == "" {
  326. ret = &result{x: x.(*rec).link}
  327. } else {
  328. z := x.getField(i.Path)
  329. ret = sel(z)
  330. }
  331. case nil:
  332. if i.Name == "@" {
  333. fmt.Println("ptr")
  334. if hm := m.Domain().Discover(context.HEAP).(scope.Manager); hm != nil {
  335. ret = &result{x: hm.Select(i)}
  336. } else {
  337. panic(0)
  338. }
  339. }
  340. default:
  341. panic(0)
  342. }
  343. return ret
  344. }
  345. for e := m.areas.Front(); (e != nil) && (res == nil); e = e.Next() {
  346. h := e.Value.(*area)
  347. if h.ready {
  348. res = sel(h.get(i))
  349. }
  350. }
  351. assert.For(res != nil, 40)
  352. //fmt.Println(res.x)
  353. return res.x
  354. }
  355. func arrConv(x interface{}) []interface{} {
  356. switch a := x.(type) {
  357. case string:
  358. s := []rune(a)
  359. ret := make([]interface{}, 0)
  360. for i := 0; i < len(s); i++ {
  361. ret = append(ret, s[i])
  362. }
  363. return ret
  364. case []interface{}:
  365. return a
  366. case int32:
  367. fmt.Println("not an array")
  368. return []interface{}{rune(0)}
  369. default:
  370. panic(fmt.Sprintln("unsupported", reflect.TypeOf(x)))
  371. }
  372. }
  373. func (m *manager) Update(i scope.ID, val scope.ValueFor) {
  374. assert.For(val != nil, 21)
  375. fmt.Println("update", i)
  376. var x interface{}
  377. var upd func(x interface{}) (ret interface{})
  378. upd = func(x interface{}) (ret interface{}) {
  379. fmt.Println(reflect.TypeOf(x))
  380. switch x := x.(type) {
  381. case value:
  382. old := x.get()
  383. tmp := val(old)
  384. assert.For(tmp != nil, 40) //если устанавливают значение NIL, значит делают что-то неверно
  385. //fmt.Println(tmp)
  386. x.set(tmp)
  387. ret = x
  388. case reference:
  389. fmt.Println(x.id())
  390. switch {
  391. case x.id().Ref != nil && *x.id().Ref == 0: //это нулевой указатель
  392. tmp := val(nil)
  393. ret = x
  394. switch id := tmp.(type) {
  395. case scope.ID:
  396. x.id(id)
  397. case object.VariableObject:
  398. x.id(odesign(id))
  399. default:
  400. panic(fmt.Sprintln("only id for nil pointer", reflect.TypeOf(id)))
  401. }
  402. case x.id().Ref != nil && *x.id().Ref != 0: //это указатель на объект в куче
  403. i.Name = x.id().Name
  404. i.Ref = x.id().Ref
  405. ret = nil
  406. default: //это параметр процедуры
  407. i.Name = x.id().Name
  408. ret = nil
  409. }
  410. case array:
  411. if i.Index != nil {
  412. old := x.get(*i.Index)
  413. tmp := val(old)
  414. assert.For(tmp != nil, 40) //если устанавливают значение NIL, значит делают что-то неверно
  415. //fmt.Println(tmp)
  416. x.set(*i.Index, tmp)
  417. } else {
  418. old := x.sel()
  419. tmp := val(old)
  420. assert.For(tmp != nil, 40) //если устанавливают значение NIL, значит делают что-то неверно
  421. //fmt.Println(tmp)
  422. x.upd(arrConv(tmp))
  423. }
  424. ret = x
  425. case record:
  426. if i.Path == "" {
  427. //fmt.Println(i, depth)
  428. panic(0) //случай выбора всей записи целиком
  429. } else {
  430. z := x.getField(i.Path)
  431. ret = upd(z)
  432. }
  433. case nil:
  434. if i.Name == "@" {
  435. fmt.Println("ptr")
  436. if hm := m.Domain().Discover(context.HEAP).(scope.Manager); hm != nil {
  437. hm.Update(i, val)
  438. ret = hm
  439. } else {
  440. panic(0)
  441. }
  442. } else {
  443. ret = x
  444. }
  445. default:
  446. panic(fmt.Sprintln("unhandled", reflect.TypeOf(x)))
  447. }
  448. return ret
  449. }
  450. for e := m.areas.Front(); (e != nil) && (x == nil); e = e.Next() {
  451. h := e.Value.(*area)
  452. x = upd(h.get(i))
  453. }
  454. assert.For(x != nil, 40)
  455. }
  456. func (m *manager) Init(d context.Domain) { m.d = d }
  457. func (m *manager) Domain() context.Domain { return m.d }
  458. func (m *manager) Handle(msg interface{}) {}
  459. func FindObjByName(mgr scope.Manager, name string) (ret object.Object) {
  460. assert.For(name != "", 20)
  461. m := mgr.(*manager)
  462. for e := m.areas.Front(); (e != nil) && (ret == nil); e = e.Next() {
  463. h := e.Value.(*area)
  464. x := h.get(scope.ID{Name: name})
  465. switch x.(type) {
  466. case *basic:
  467. ret = x.(*basic).link
  468. default:
  469. //fmt.Println("no such object")
  470. }
  471. }
  472. return ret
  473. }