ms.go 7.5 KB

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