ms.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  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, object.ArrayType, object.DynArrayType:
  90. l.v[l.next] = newData(x)
  91. l.k[x.Adr()] = l.next
  92. l.next++
  93. case object.RecordType:
  94. l.v[l.next] = newRec(x)
  95. nl := newlvl()
  96. nl.nested = true
  97. l.l[l.next] = nl
  98. l.k[x.Adr()] = l.next
  99. fl := make([]object.Object, 0)
  100. for rec := t; rec != nil; {
  101. for x := rec.Link(); x != nil; x = x.Link() {
  102. //fmt.Println(o.Name(), ".", x.Name(), x.Adr())
  103. fl = append(fl, x)
  104. }
  105. rec = rec.BaseType()
  106. }
  107. //fmt.Println("record")
  108. l.v[l.next].(*rec).l = nl
  109. nl.alloc(mod, root, fl, skip)
  110. l.next++
  111. case object.PointerType:
  112. l.v[l.next] = newPtr(x)
  113. l.k[x.Adr()] = l.next
  114. l.next++
  115. default:
  116. halt.As(20, reflect.TypeOf(t))
  117. }
  118. case object.TypeObject, object.ConstantObject, object.ProcedureObject, object.Module:
  119. //do nothing
  120. case object.ParameterObject:
  121. if root.(node.EnterNode).Enter() == enter.PROCEDURE {
  122. l.r[l.next] = newRef(x)
  123. l.k[x.Adr()] = l.next
  124. l.next++
  125. }
  126. default:
  127. halt.As(20, reflect.TypeOf(x))
  128. }
  129. }
  130. }
  131. }
  132. func (a *salloc) Allocate(n node.Node, final bool) {
  133. mod := rtm.DomainModule(a.area.d)
  134. utils.PrintScope("ALLOCATE FOR", mod.Name, n.Adr())
  135. tl := mod.Types[n]
  136. skip := make(map[cp.ID]interface{}) //для процедурных типов в общей куче могут валяться переменные, скипаем их
  137. for _, t := range tl {
  138. switch x := t.(type) {
  139. case object.BasicType:
  140. for link := x.Link(); link != nil; link = link.Link() {
  141. skip[link.Adr()] = link
  142. }
  143. case object.RecordType:
  144. for link := x.Link(); link != nil; link = link.Link() {
  145. skip[link.Adr()] = link
  146. }
  147. }
  148. }
  149. nl := newlvl()
  150. nl.ready = final
  151. a.area.data = append(a.area.data, nl)
  152. nl.alloc(mod, n, mod.Objects[n], skip)
  153. }
  154. func (a *salloc) Dispose(n node.Node) {
  155. x := a.area.data
  156. a.area.data = nil
  157. for i := 0; i < len(x)-1; i++ {
  158. a.area.data = append(a.area.data, x[i])
  159. }
  160. }
  161. func (a *salloc) Initialize(n node.Node, par scope.PARAM) (seq frame.Sequence, ret frame.WAIT) {
  162. utils.PrintScope("INITIALIZE")
  163. l := a.area.top()
  164. assert.For(l != nil && !l.ready, 20)
  165. val := par.Values
  166. f := par.Frame
  167. end := func(frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  168. l.ready = true
  169. if par.Tail != nil {
  170. return par.Tail(f)
  171. } else {
  172. return frame.End()
  173. }
  174. }
  175. seq = end
  176. ret = frame.NOW
  177. var sm scope.Manager
  178. for next := par.Objects; next != nil; next = next.Link() {
  179. mod := rtm.ModuleOfNode(f.Domain(), val)
  180. if mod != nil {
  181. global := f.Domain().Discover(context.UNIVERSE).(context.Domain)
  182. fmt.Println(mod.Name)
  183. global = global.Discover(mod.Name).(context.Domain)
  184. sm = global.Discover(context.SCOPE).(scope.Manager)
  185. } else {
  186. sm = a.area
  187. }
  188. switch o := next.(type) {
  189. case object.VariableObject:
  190. switch nv := val.(type) {
  191. case node.ConstantNode:
  192. v := newConst(nv)
  193. l.v[l.k[o.Adr()]].Set(v)
  194. case node.VariableNode:
  195. v := sm.Select(nv.Object().Adr())
  196. l.v[l.k[o.Adr()]].Set(v)
  197. default:
  198. halt.As(40, reflect.TypeOf(nv))
  199. }
  200. case object.ParameterObject:
  201. switch nv := val.(type) {
  202. case node.VariableNode:
  203. old := l.r[l.k[o.Adr()]].(*ref)
  204. l.r[l.k[o.Adr()]] = &ref{link: old.link, sc: sm, id: nv.Object().Adr()}
  205. case node.ConstantNode: //array :) заменяем ссылку на переменную
  206. old := l.r[l.k[o.Adr()]].(*ref)
  207. l.r[l.k[o.Adr()]] = nil
  208. data := newConst(nv)
  209. switch data.(type) {
  210. case STRING, SHORTSTRING:
  211. val := &dynarr{link: old.link}
  212. val.Set(data)
  213. l.v[l.k[o.Adr()]] = val
  214. default:
  215. halt.As(100, reflect.TypeOf(data))
  216. }
  217. case node.DerefNode:
  218. rt2.Push(rt2.New(nv), f)
  219. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  220. return rt2.ValueOf(f)[nv.Adr()] != nil, 60
  221. })
  222. dn := next
  223. old := l.r[l.k[dn.Adr()]].(*ref)
  224. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  225. switch dn.(type) {
  226. case object.VariableObject, object.ParameterObject:
  227. l.r[l.k[dn.Adr()]] = nil
  228. data := rt2.ValueOf(f)[nv.Adr()]
  229. switch deref := data.(type) {
  230. case STRING, SHORTSTRING:
  231. val := &dynarr{link: old.link}
  232. val.Set(deref)
  233. l.v[l.k[dn.Adr()]] = val
  234. case *rec:
  235. l.v[l.k[dn.Adr()]] = deref
  236. default:
  237. halt.As(100, reflect.TypeOf(data))
  238. }
  239. default:
  240. panic(fmt.Sprintln("unknown value", reflect.TypeOf(next)))
  241. }
  242. return end, frame.NOW
  243. }
  244. ret = frame.LATER
  245. default:
  246. halt.As(40, reflect.TypeOf(nv))
  247. }
  248. default:
  249. halt.As(40, reflect.TypeOf(o))
  250. }
  251. val = val.Link()
  252. }
  253. return seq, ret
  254. }
  255. func (a *salloc) Join(m scope.Manager) { a.area = m.(*area) }
  256. func (a *area) Update(id cp.ID, fval scope.ValueFor) {
  257. assert.For(id != 0, 20)
  258. var upd func(x int, id cp.ID)
  259. var k int
  260. upd = func(x int, id cp.ID) {
  261. utils.PrintScope("UPDATE", id)
  262. for i := x - 1; i >= 0 && k == 0; i-- {
  263. l := a.data[i]
  264. if l.ready {
  265. k = l.k[id]
  266. if k != 0 {
  267. v := a.data[i].v[k]
  268. if v == nil { //ref?
  269. r := l.r[k]
  270. if r != nil {
  271. utils.PrintScope("ref")
  272. if r.(*ref).sc == a {
  273. upd(i, r.(*ref).id)
  274. } else {
  275. k = -1
  276. r.(*ref).sc.Update(r.(*ref).id, fval)
  277. }
  278. break
  279. }
  280. } else {
  281. v.Set(fval(a.data[i].v[k]))
  282. }
  283. }
  284. }
  285. }
  286. }
  287. k = 0
  288. upd(len(a.data), id)
  289. assert.For(k != 0, 60)
  290. }
  291. func (a *area) Select(id cp.ID, val ...scope.ValueOf) (ret scope.Value) {
  292. var sel func(x int, id cp.ID)
  293. sel = func(x int, id cp.ID) {
  294. utils.PrintScope("SELECT", id)
  295. for i := x - 1; i >= 0 && ret == nil; i-- {
  296. l := a.data[i]
  297. k := 0
  298. if l.ready {
  299. k = l.k[id]
  300. if k != 0 {
  301. ret = l.v[k]
  302. if ret == nil { //ref?
  303. r := l.r[k]
  304. if r != nil {
  305. if l.l[k] != nil { //rec
  306. panic(0)
  307. } else {
  308. utils.PrintScope("ref")
  309. if r.(*ref).sc == a {
  310. sel(i, r.(*ref).id)
  311. } else {
  312. ret = r.(*ref).sc.Select(r.(*ref).id)
  313. }
  314. }
  315. break
  316. }
  317. } else if len(val) > 0 {
  318. val[0](ret)
  319. }
  320. }
  321. }
  322. }
  323. }
  324. sel(len(a.data), id)
  325. assert.For(ret != nil, 60)
  326. return ret
  327. }
  328. func (a *area) Target(all ...scope.Allocator) scope.Allocator {
  329. if len(all) > 0 {
  330. a.all = all[0]
  331. }
  332. if a.all == nil {
  333. return &salloc{area: a}
  334. } else {
  335. a.all.Join(a)
  336. return a.all
  337. }
  338. }
  339. func (a *area) String() (ret string) {
  340. for _, l := range a.data {
  341. ret = fmt.Sprintln(ret, l)
  342. }
  343. return ret
  344. }
  345. func (l *level) String() (ret string) {
  346. for k, v := range l.k {
  347. ret = fmt.Sprint(ret, "@", k, v, l.v[v])
  348. if l.v[v] == nil {
  349. ret = fmt.Sprintln(ret, l.r[v])
  350. } else if l.l[v] != nil {
  351. ret = fmt.Sprintln(ret, "{")
  352. ret = fmt.Sprintln(ret, l.l[v], "}")
  353. } else {
  354. ret = fmt.Sprintln(ret)
  355. }
  356. }
  357. return ret
  358. }
  359. func (a *area) Init(d context.Domain) { a.d = d }
  360. func (a *area) Domain() context.Domain { return a.d }
  361. func (a *area) Handle(msg interface{}) {}
  362. func fn(mgr scope.Manager, name string) (ret object.Object) {
  363. utils.PrintScope("FIND", name)
  364. a, ok := mgr.(*area)
  365. assert.For(ok, 20)
  366. assert.For(name != "", 21)
  367. for i := len(a.data) - 1; i >= 0 && ret == nil; i-- {
  368. l := a.data[i]
  369. for _, v := range l.v {
  370. switch vv := v.(type) {
  371. case *data:
  372. utils.PrintScope(vv.link.Name())
  373. if vv.link.Name() == name {
  374. ret = vv.link
  375. }
  376. default:
  377. utils.PrintScope(reflect.TypeOf(vv))
  378. }
  379. }
  380. }
  381. return ret
  382. }
  383. func nn(role string) scope.Manager {
  384. if role == context.SCOPE {
  385. return &area{all: &salloc{}}
  386. } else if role == context.HEAP {
  387. return &area{all: &halloc{}}
  388. } else {
  389. panic(0)
  390. }
  391. }
  392. func init() {
  393. scope.New = nn
  394. scope.FindObjByName = fn
  395. }