ms.go 8.7 KB

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