stack.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. package data
  2. import (
  3. "fmt"
  4. "fw/cp"
  5. "fw/cp/node"
  6. "fw/cp/object"
  7. "fw/rt2"
  8. "fw/rt2/context"
  9. "fw/rt2/frame"
  10. rtm "fw/rt2/module"
  11. "fw/rt2/rules2/wrap/data/items"
  12. "fw/rt2/rules2/wrap/eval"
  13. "fw/rt2/scope"
  14. "fw/utils"
  15. "reflect"
  16. "ypk/assert"
  17. "ypk/halt"
  18. )
  19. type area struct {
  20. d context.Domain
  21. all scope.Allocator
  22. il items.Data
  23. }
  24. type salloc struct {
  25. area *area
  26. }
  27. type key struct {
  28. items.Key
  29. id cp.ID
  30. }
  31. func (k *key) String() string {
  32. return fmt.Sprint(k.id)
  33. }
  34. func (k *key) EqualTo(to items.Key) int {
  35. kk, ok := to.(*key)
  36. if ok && kk.id == k.id {
  37. return 0
  38. } else {
  39. return -1
  40. }
  41. }
  42. type item struct {
  43. items.Item
  44. k items.Key
  45. d interface{}
  46. }
  47. func (i *item) KeyOf(k ...items.Key) items.Key {
  48. if len(k) == 1 {
  49. i.k = k[0]
  50. }
  51. return i.k
  52. }
  53. func (i *item) Copy(from items.Item) { panic(0) }
  54. func (i *item) Data(d ...interface{}) interface{} {
  55. if len(d) == 1 {
  56. i.d = d[0]
  57. }
  58. return i.d
  59. }
  60. func (i *item) Value() scope.Value {
  61. return i.d.(scope.Value)
  62. }
  63. func (a *area) Select(this cp.ID, val scope.ValueOf) {
  64. utils.PrintScope("SELECT", this)
  65. d, ok := a.il.Get(&key{id: this}).(*item)
  66. assert.For(ok, 20, this)
  67. val(d.Value())
  68. }
  69. func (a *area) Exists(this cp.ID) bool {
  70. utils.PrintScope("SEARCH", this)
  71. return a.il.Exists(&key{id: this})
  72. }
  73. func (a *salloc) push(_o object.Object) {
  74. switch o := _o.(type) {
  75. case object.VariableObject:
  76. switch t := o.Complex().(type) {
  77. case nil, object.BasicType:
  78. x := newData(o)
  79. d := &item{}
  80. d.Data(x)
  81. a.area.il.Set(&key{id: o.Adr()}, d)
  82. case object.ArrayType, object.DynArrayType:
  83. x := newData(o)
  84. d := &item{}
  85. d.Data(x)
  86. a.area.il.Set(&key{id: o.Adr()}, d)
  87. //case object.RecordType:
  88. default:
  89. halt.As(100, reflect.TypeOf(t))
  90. }
  91. case object.ParameterObject:
  92. a.area.il.Hold(&key{id: o.Adr()})
  93. default:
  94. halt.As(100, reflect.TypeOf(o))
  95. }
  96. }
  97. func (a *salloc) Allocate(n node.Node, final bool) {
  98. mod := rtm.ModuleOfNode(a.area.d, n)
  99. utils.PrintScope("ALLOCATE FOR", mod.Name, n.Adr())
  100. tl := mod.Types[n]
  101. skip := make(map[cp.ID]interface{}) //для процедурных типов в общей куче могут валяться переменные, скипаем их
  102. for _, t := range tl {
  103. switch x := t.(type) {
  104. case object.BasicType:
  105. for link := x.Link(); link != nil; link = link.Link() {
  106. skip[link.Adr()] = link
  107. }
  108. case object.RecordType:
  109. for link := x.Link(); link != nil; link = link.Link() {
  110. skip[link.Adr()] = link
  111. }
  112. }
  113. }
  114. //все объекты скоупа
  115. ol := mod.Objects[n]
  116. //добавим либо переменные внутри процедуры либо если мы создаем скоуп для модуля то процедурные объекты добавим в скиплист
  117. switch o := n.Object().(type) {
  118. case object.ProcedureObject:
  119. for l := o.Link(); l != nil; l = l.Link() {
  120. ol = append(ol, l)
  121. }
  122. case nil: //do nothing
  123. default:
  124. halt.As(100, reflect.TypeOf(o))
  125. }
  126. for _, o := range ol {
  127. switch t := o.(type) {
  128. case object.ProcedureObject:
  129. for l := t.Link(); l != nil; l = l.Link() {
  130. skip[l.Adr()] = l
  131. }
  132. skip[o.Adr()] = o
  133. case object.TypeObject:
  134. skip[o.Adr()] = o
  135. case object.ConstantObject:
  136. skip[o.Adr()] = o
  137. }
  138. }
  139. a.area.il.Begin()
  140. for _, o := range ol {
  141. if skip[o.Adr()] == nil {
  142. utils.PrintScope(o.Adr(), o.Name())
  143. a.push(o)
  144. }
  145. }
  146. if final {
  147. a.area.il.End()
  148. }
  149. }
  150. func (a *salloc) Dispose(n node.Node) {
  151. a.area.il.Drop()
  152. }
  153. func (a *salloc) proper_init(root node.Node, _val node.Node, _par object.Object, tail eval.Do, in eval.IN) eval.Do {
  154. utils.PrintScope("INITIALIZE")
  155. const link = "initialize:par"
  156. end := func(in eval.IN) eval.OUT {
  157. a.area.il.End()
  158. return eval.Later(tail)
  159. }
  160. var next eval.Do
  161. do := func(val node.Node, par object.Object) (out eval.OUT) {
  162. utils.PrintScope(par.Adr(), par.Name(), ":=", reflect.TypeOf(val))
  163. out = eval.Now(next)
  164. switch par.(type) {
  165. case object.VariableObject:
  166. out = eval.GetExpression(in, link, val, func(in eval.IN) eval.OUT {
  167. it := a.area.il.Get(&key{id: par.Adr()}, items.INIT).(*item)
  168. v := it.Value().(scope.Variable)
  169. val := rt2.ValueOf(in.Frame)[eval.KeyOf(in, link)]
  170. v.Set(val)
  171. return eval.Later(next)
  172. })
  173. case object.ParameterObject:
  174. switch val.(type) {
  175. case node.Designator:
  176. out = eval.GetDesignator(in, link, val, func(in eval.IN) eval.OUT {
  177. mt := rt2.RegOf(in.Frame)[context.META].(*eval.Meta)
  178. fa := mt.Scope.(*area).il
  179. a.area.il.Link(&key{id: par.Adr()}, items.ID{In: fa, This: &key{id: mt.Id}})
  180. return eval.Later(next)
  181. })
  182. case node.Expression: //array заменяем ссылку на переменную
  183. out = eval.GetExpression(in, link, val, func(in eval.IN) eval.OUT {
  184. d := &item{}
  185. data := rt2.ValueOf(in.Frame)[eval.KeyOf(in, link)]
  186. switch data.(type) {
  187. case STRING, SHORTSTRING:
  188. val := &dynarr{link: par}
  189. val.Set(data)
  190. d.Data(val)
  191. default:
  192. halt.As(100, reflect.TypeOf(data))
  193. }
  194. a.area.il.Put(&key{id: par.Adr()}, d)
  195. return eval.Later(next)
  196. })
  197. default:
  198. halt.As(100, reflect.TypeOf(val))
  199. }
  200. default:
  201. halt.As(100, reflect.TypeOf(par))
  202. }
  203. return
  204. }
  205. val := _val
  206. par := _par
  207. next = func(eval.IN) eval.OUT {
  208. if val == nil {
  209. return eval.Later(end)
  210. } else {
  211. step := do(val, par)
  212. val = val.Link()
  213. par = par.Link()
  214. return step
  215. }
  216. }
  217. return next
  218. }
  219. func (a *salloc) Initialize(n node.Node, par scope.PARAM) (frame.Sequence, frame.WAIT) {
  220. var tail eval.Do
  221. if par.Tail != nil {
  222. tail = eval.Expose(par.Tail)
  223. } else {
  224. tail = eval.Tail(eval.STOP)
  225. }
  226. return eval.Propose(a.proper_init(n, par.Values, par.Objects, tail, eval.IN{Frame: par.Frame, Parent: par.Frame.Parent()})), frame.NOW
  227. }
  228. func (a *salloc) Join(m scope.Manager) { a.area = m.(*area) }
  229. func (a *area) Target(all ...scope.Allocator) scope.Allocator {
  230. if len(all) > 0 {
  231. a.all = all[0]
  232. }
  233. if a.all == nil {
  234. return &salloc{area: a}
  235. } else {
  236. a.all.Join(a)
  237. return a.all
  238. }
  239. }
  240. func (a *area) String() string { return "fixme" }
  241. func (a *area) Provide(x interface{}) scope.Value {
  242. switch z := x.(type) {
  243. case node.ConstantNode:
  244. return newConst(z)
  245. case object.ProcedureObject:
  246. return newProc(z)
  247. default:
  248. halt.As(100, reflect.TypeOf(z))
  249. }
  250. panic(0)
  251. }
  252. func (a *area) Init(d context.Domain) { a.d = d }
  253. func (a *area) Domain() context.Domain { return a.d }
  254. func (a *area) Handle(msg interface{}) {}
  255. func nn(role string) scope.Manager {
  256. switch role {
  257. case context.SCOPE, context.CALL:
  258. return &area{all: &salloc{}, il: items.New()}
  259. case context.HEAP:
  260. return &area{all: nil}
  261. //return &area{all: &halloc{}}
  262. default:
  263. panic(0)
  264. }
  265. }
  266. func fn(mgr scope.Manager, name string) (ret object.Object) {
  267. utils.PrintScope("FIND", name)
  268. a, ok := mgr.(*area)
  269. assert.For(ok, 20)
  270. assert.For(name != "", 21)
  271. a.il.ForEach(func(in items.Value) (ok bool) {
  272. var v scope.Value
  273. switch val := in.(type) {
  274. case *item:
  275. v = val.Value()
  276. }
  277. switch vv := v.(type) {
  278. case *data:
  279. utils.PrintScope(vv.link.Name())
  280. if vv.link.Name() == name {
  281. ret = vv.link
  282. ok = true
  283. }
  284. default:
  285. utils.PrintScope(reflect.TypeOf(vv))
  286. }
  287. return
  288. })
  289. return ret
  290. }
  291. func init() {
  292. scope.New = nn
  293. scope.FindObjByName = fn
  294. }