ms.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. package modern
  2. import (
  3. "fmt"
  4. "fw/cp"
  5. "fw/cp/constant/enter"
  6. cpm "fw/cp/module"
  7. "fw/cp/node"
  8. "fw/cp/object"
  9. "fw/rt2"
  10. "fw/rt2/context"
  11. "fw/rt2/frame"
  12. rtm "fw/rt2/module"
  13. "fw/rt2/scope"
  14. "fw/utils"
  15. "reflect"
  16. "ypk/assert"
  17. "ypk/halt"
  18. )
  19. type level struct {
  20. k map[cp.ID]int
  21. v map[int]scope.Variable
  22. r map[int]scope.Ref
  23. l map[int]*level
  24. next int
  25. ready bool
  26. nested bool
  27. }
  28. type area struct {
  29. d context.Domain
  30. data []*level
  31. all scope.Allocator
  32. }
  33. type salloc struct {
  34. area *area
  35. }
  36. type ref struct {
  37. scope.Ref
  38. id cp.ID
  39. link object.Object
  40. sc scope.Manager
  41. }
  42. func (r *ref) String() string {
  43. var m string
  44. if r.sc != nil {
  45. m = rtm.DomainModule(r.sc.Domain()).Name
  46. }
  47. return fmt.Sprint(m, " ", r.link.Name(), "@", r.id)
  48. }
  49. func newRef(x object.Object) *ref {
  50. return &ref{link: x}
  51. }
  52. func newlvl() *level {
  53. return &level{next: 1,
  54. k: make(map[cp.ID]int), ready: true,
  55. v: make(map[int]scope.Variable),
  56. r: make(map[int]scope.Ref),
  57. l: make(map[int]*level)}
  58. }
  59. func (a *area) top() *level {
  60. if len(a.data) > 0 {
  61. return a.data[len(a.data)-1]
  62. }
  63. return nil
  64. }
  65. func (a *area) Provide(x interface{}) scope.ValueFor {
  66. return func(scope.Value) scope.Value {
  67. switch z := x.(type) {
  68. case node.ConstantNode:
  69. return newConst(z)
  70. case object.ProcedureObject:
  71. return newProc(z)
  72. default:
  73. halt.As(100, reflect.TypeOf(z))
  74. }
  75. panic(0)
  76. }
  77. }
  78. //var alloc func(*level, []object.Object, map[cp.ID]interface{})
  79. func (l *level) alloc(mod *cpm.Module, root node.Node, ol []object.Object, skip map[cp.ID]interface{}) {
  80. for _, o := range ol {
  81. imp := mod.ImportOf(o)
  82. utils.PrintScope(reflect.TypeOf(o), o.Adr())
  83. _, field := o.(object.FieldObject)
  84. if imp == "" && (skip[o.Adr()] == nil || (field && l.nested)) {
  85. utils.PrintScope("next", l.next)
  86. switch x := o.(type) {
  87. case object.VariableObject, object.FieldObject:
  88. switch t := o.Complex().(type) {
  89. case nil, object.BasicType:
  90. l.v[l.next] = newData(x)
  91. l.k[x.Adr()] = l.next
  92. l.next++
  93. case object.ArrayType, object.DynArrayType:
  94. l.v[l.next] = newData(x)
  95. l.k[x.Adr()] = l.next
  96. l.next++
  97. case object.RecordType:
  98. l.v[l.next] = newRec(x)
  99. nl := newlvl()
  100. nl.nested = true
  101. l.l[l.next] = nl
  102. l.k[x.Adr()] = l.next
  103. fl := make([]object.Object, 0)
  104. for rec := t; rec != nil; {
  105. for x := rec.Link(); x != nil; x = x.Link() {
  106. //fmt.Println(o.Name(), ".", x.Name(), x.Adr())
  107. fl = append(fl, x)
  108. }
  109. rec = rec.BaseType()
  110. }
  111. //fmt.Println("record")
  112. l.v[l.next].(*rec).l = nl
  113. nl.alloc(mod, root, fl, skip)
  114. l.next++
  115. case object.PointerType:
  116. l.v[l.next] = newPtr(x)
  117. l.k[x.Adr()] = l.next
  118. l.next++
  119. default:
  120. halt.As(20, reflect.TypeOf(t))
  121. }
  122. case object.TypeObject, object.ConstantObject, object.ProcedureObject, object.Module:
  123. //do nothing
  124. case object.ParameterObject:
  125. if root.(node.EnterNode).Enter() == enter.PROCEDURE {
  126. l.r[l.next] = newRef(x)
  127. l.k[x.Adr()] = l.next
  128. l.next++
  129. }
  130. default:
  131. halt.As(20, reflect.TypeOf(x))
  132. }
  133. }
  134. }
  135. }
  136. func (a *salloc) Allocate(n node.Node, final bool) {
  137. mod := rtm.DomainModule(a.area.d)
  138. utils.PrintScope("ALLOCATE FOR", mod.Name, n.Adr())
  139. tl := mod.Types[n]
  140. skip := make(map[cp.ID]interface{}) //для процедурных типов в общей куче могут валяться переменные, скипаем их
  141. for _, t := range tl {
  142. switch x := t.(type) {
  143. case object.BasicType:
  144. for link := x.Link(); link != nil; link = link.Link() {
  145. skip[link.Adr()] = link
  146. }
  147. case object.RecordType:
  148. for link := x.Link(); link != nil; link = link.Link() {
  149. skip[link.Adr()] = link
  150. }
  151. }
  152. }
  153. ol := mod.Objects[n]
  154. switch o := n.Object().(type) {
  155. case object.ProcedureObject:
  156. for l := o.Link(); l != nil; l = l.Link() {
  157. ol = append(ol, l)
  158. }
  159. case nil:
  160. for _, o := range ol {
  161. switch t := o.(type) {
  162. case object.ProcedureObject:
  163. for l := t.Link(); l != nil; l = l.Link() {
  164. skip[l.Adr()] = l
  165. }
  166. }
  167. }
  168. default:
  169. halt.As(100, reflect.TypeOf(o))
  170. }
  171. nl := newlvl()
  172. nl.ready = final
  173. a.area.data = append(a.area.data, nl)
  174. nl.alloc(mod, n, ol, skip)
  175. }
  176. func (a *salloc) Dispose(n node.Node) {
  177. x := a.area.data
  178. old := x[len(x)-1]
  179. old.k = nil
  180. old.v = nil
  181. old.l = nil
  182. old.r = nil
  183. a.area.data = nil
  184. for i := 0; i < len(x)-1; i++ {
  185. a.area.data = append(a.area.data, x[i])
  186. }
  187. }
  188. func (a *salloc) Initialize(n node.Node, par scope.PARAM) (seq frame.Sequence, ret frame.WAIT) {
  189. utils.PrintScope("INITIALIZE")
  190. l := a.area.top()
  191. assert.For(l != nil && !l.ready, 20)
  192. val := par.Values
  193. f := par.Frame
  194. end := func(frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  195. l.ready = true
  196. if par.Tail != nil {
  197. return par.Tail(f)
  198. } else {
  199. return frame.End()
  200. }
  201. }
  202. seq = end
  203. ret = frame.NOW
  204. var sm scope.Manager
  205. for next := par.Objects; next != nil; next = next.Link() {
  206. global := f.Domain().Discover(context.UNIVERSE).(context.Domain)
  207. mod := rtm.ModuleOfNode(f.Domain(), val)
  208. //mod := rtm.ModuleOfNode(f.Domain(), val.Object())
  209. if mod != nil {
  210. //fmt.Println(mod.Name)
  211. global = global.Discover(mod.Name).(context.Domain)
  212. sm = global.Discover(context.SCOPE).(scope.Manager)
  213. } else { //для фиктивных узлов, которые созданы рантаймом, типа INC/DEC
  214. sm = a.area
  215. }
  216. switch o := next.(type) {
  217. case object.VariableObject:
  218. switch nv := val.(type) {
  219. case node.ConstantNode:
  220. v := newConst(nv)
  221. l.v[l.k[o.Adr()]].Set(v)
  222. case node.VariableNode, node.ParameterNode:
  223. v := sm.Select(nv.Object().Adr())
  224. l.v[l.k[o.Adr()]].Set(v)
  225. case node.OperationNode:
  226. nf := rt2.New(nv)
  227. rt2.Push(nf, f)
  228. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  229. return rt2.ValueOf(f)[nv.Adr()] != nil, 59
  230. })
  231. rt2.ReplaceDomain(nf, global)
  232. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  233. v := rt2.ValueOf(f)[nv.Adr()]
  234. l.v[l.k[o.Adr()]].Set(v)
  235. return end, frame.NOW
  236. }
  237. ret = frame.LATER
  238. case node.FieldNode, node.DerefNode:
  239. nf := rt2.New(nv)
  240. rt2.Push(nf, f)
  241. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  242. return rt2.ValueOf(f)[nv.Adr()] != nil, 60
  243. })
  244. rt2.ReplaceDomain(nf, global)
  245. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  246. v := rt2.ValueOf(f)[nv.Adr()]
  247. l.v[l.k[o.Adr()]].Set(v)
  248. return end, frame.NOW
  249. }
  250. ret = frame.LATER
  251. default:
  252. halt.As(40, reflect.TypeOf(nv))
  253. }
  254. case object.ParameterObject:
  255. switch nv := val.(type) {
  256. case node.VariableNode:
  257. old := l.r[l.k[o.Adr()]].(*ref)
  258. l.r[l.k[o.Adr()]] = &ref{link: old.link, sc: sm, id: nv.Object().Adr()}
  259. case node.ConstantNode: //array :) заменяем ссылку на переменную
  260. old := l.r[l.k[o.Adr()]].(*ref)
  261. l.r[l.k[o.Adr()]] = nil
  262. data := newConst(nv)
  263. switch data.(type) {
  264. case STRING, SHORTSTRING:
  265. val := &dynarr{link: old.link}
  266. val.Set(data)
  267. l.v[l.k[o.Adr()]] = val
  268. default:
  269. halt.As(100, reflect.TypeOf(data))
  270. }
  271. case node.DerefNode:
  272. rt2.Push(rt2.New(nv), f)
  273. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  274. return rt2.ValueOf(f)[nv.Adr()] != nil, 61
  275. })
  276. dn := next
  277. old := l.r[l.k[dn.Adr()]].(*ref)
  278. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  279. switch dn.(type) {
  280. case object.VariableObject, object.ParameterObject:
  281. l.r[l.k[dn.Adr()]] = nil
  282. data := rt2.ValueOf(f)[nv.Adr()]
  283. switch deref := data.(type) {
  284. case STRING, SHORTSTRING:
  285. val := &dynarr{link: old.link}
  286. val.Set(deref)
  287. l.v[l.k[dn.Adr()]] = val
  288. case *rec:
  289. l.v[l.k[dn.Adr()]] = deref
  290. default:
  291. halt.As(100, reflect.TypeOf(data))
  292. }
  293. default:
  294. panic(fmt.Sprintln("unknown value", reflect.TypeOf(next)))
  295. }
  296. return end, frame.NOW
  297. }
  298. ret = frame.LATER
  299. default:
  300. halt.As(40, reflect.TypeOf(nv))
  301. }
  302. default:
  303. halt.As(40, reflect.TypeOf(o))
  304. }
  305. val = val.Link()
  306. }
  307. return seq, ret
  308. }
  309. func (a *salloc) Join(m scope.Manager) { a.area = m.(*area) }
  310. func (a *area) Update(id cp.ID, fval scope.ValueFor) {
  311. assert.For(id != 0, 20)
  312. var upd func(x int, id cp.ID)
  313. var k int
  314. upd = func(x int, id cp.ID) {
  315. utils.PrintScope("UPDATE", id)
  316. for i := x - 1; i >= 0 && k == 0; i-- {
  317. l := a.data[i]
  318. if l.ready {
  319. k = l.k[id]
  320. if k != 0 {
  321. v := a.data[i].v[k]
  322. if v == nil { //ref?
  323. r := l.r[k]
  324. if r != nil {
  325. utils.PrintScope("ref")
  326. if r.(*ref).sc == a {
  327. upd(i, r.(*ref).id)
  328. } else {
  329. k = -1
  330. r.(*ref).sc.Update(r.(*ref).id, fval)
  331. }
  332. break
  333. }
  334. } else {
  335. v.Set(fval(a.data[i].v[k]))
  336. }
  337. }
  338. }
  339. }
  340. }
  341. k = 0
  342. upd(len(a.data), id)
  343. assert.For(k != 0, 60)
  344. }
  345. func (a *area) Select(id cp.ID, val ...scope.ValueOf) (ret scope.Value) {
  346. var sel func(x int, id cp.ID)
  347. sel = func(x int, id cp.ID) {
  348. utils.PrintScope("SELECT", id)
  349. for i := x - 1; i >= 0 && ret == nil; i-- {
  350. l := a.data[i]
  351. k := 0
  352. if l.ready {
  353. k = l.k[id]
  354. if k != 0 {
  355. ret = l.v[k]
  356. if ret == nil { //ref?
  357. r := l.r[k]
  358. if r != nil {
  359. if l.l[k] != nil { //rec
  360. panic(0)
  361. } else {
  362. utils.PrintScope("ref")
  363. if r.(*ref).sc == a {
  364. sel(i, r.(*ref).id)
  365. } else {
  366. ret = r.(*ref).sc.Select(r.(*ref).id)
  367. }
  368. }
  369. break
  370. }
  371. } else if len(val) > 0 {
  372. val[0](ret)
  373. }
  374. }
  375. }
  376. }
  377. }
  378. sel(len(a.data), id)
  379. assert.For(ret != nil, 60)
  380. return ret
  381. }
  382. func (a *area) Target(all ...scope.Allocator) scope.Allocator {
  383. if len(all) > 0 {
  384. a.all = all[0]
  385. }
  386. if a.all == nil {
  387. return &salloc{area: a}
  388. } else {
  389. a.all.Join(a)
  390. return a.all
  391. }
  392. }
  393. func (a *area) String() (ret string) {
  394. for _, l := range a.data {
  395. ret = fmt.Sprintln(ret, l)
  396. }
  397. return ret
  398. }
  399. func (l *level) String() (ret string) {
  400. for k, v := range l.k {
  401. ret = fmt.Sprint(ret, "@", k, v, l.v[v])
  402. if l.v[v] == nil {
  403. ret = fmt.Sprintln(ret, l.r[v])
  404. } else if l.l[v] != nil {
  405. ret = fmt.Sprintln(ret, "{")
  406. ret = fmt.Sprintln(ret, l.l[v], "}")
  407. } else {
  408. ret = fmt.Sprintln(ret)
  409. }
  410. }
  411. return ret
  412. }
  413. func (a *area) Init(d context.Domain) { a.d = d }
  414. func (a *area) Domain() context.Domain { return a.d }
  415. func (a *area) Handle(msg interface{}) {}
  416. func fn(mgr scope.Manager, name string) (ret object.Object) {
  417. utils.PrintScope("FIND", name)
  418. a, ok := mgr.(*area)
  419. assert.For(ok, 20)
  420. assert.For(name != "", 21)
  421. for i := len(a.data) - 1; i >= 0 && ret == nil; i-- {
  422. l := a.data[i]
  423. for _, v := range l.v {
  424. switch vv := v.(type) {
  425. case *data:
  426. utils.PrintScope(vv.link.Name())
  427. if vv.link.Name() == name {
  428. ret = vv.link
  429. }
  430. default:
  431. utils.PrintScope(reflect.TypeOf(vv))
  432. }
  433. }
  434. }
  435. return ret
  436. }
  437. func nn(role string) scope.Manager {
  438. if role == context.SCOPE {
  439. return &area{all: &salloc{}}
  440. } else if role == context.HEAP {
  441. return &area{all: &halloc{}}
  442. } else {
  443. panic(0)
  444. }
  445. }
  446. func init() {
  447. scope.New = nn
  448. scope.FindObjByName = fn
  449. }