stack.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  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. init bool
  24. }
  25. type salloc struct {
  26. area *area
  27. }
  28. type key struct {
  29. items.Key
  30. id cp.ID
  31. }
  32. func (k *key) String() string {
  33. return fmt.Sprint(k.id)
  34. }
  35. func (k *key) EqualTo(to items.Key) int {
  36. kk, ok := to.(*key)
  37. if ok && kk.id == k.id {
  38. return 0
  39. } else {
  40. return -1
  41. }
  42. }
  43. type item struct {
  44. items.Item
  45. k items.Key
  46. d interface{}
  47. }
  48. func (i *item) KeyOf(k ...items.Key) items.Key {
  49. if len(k) == 1 {
  50. i.k = k[0]
  51. }
  52. return i.k
  53. }
  54. func (i *item) Copy(from items.Item) { panic(0) }
  55. func (i *item) Data(d ...interface{}) interface{} {
  56. if len(d) == 1 {
  57. i.d = d[0]
  58. }
  59. return i.d
  60. }
  61. func (i *item) Value() scope.Value {
  62. return i.d.(scope.Value)
  63. }
  64. func (a *area) Select(this cp.ID, val scope.ValueOf) {
  65. utils.PrintScope("SELECT", this)
  66. opts := make([]items.Opts, 0)
  67. if a.init {
  68. opts = append(opts, items.INIT)
  69. }
  70. d, ok := a.il.Get(&key{id: this}, opts...).(*item)
  71. assert.For(ok, 20, this)
  72. val(d.Value())
  73. }
  74. func (a *area) Exists(this cp.ID) bool {
  75. utils.PrintScope("SEARCH", this)
  76. return a.il.Exists(&key{id: this})
  77. }
  78. func push(dom context.Domain, il items.Data, _o object.Object) {
  79. switch o := _o.(type) {
  80. case object.VariableObject, object.FieldObject:
  81. switch t := o.Complex().(type) {
  82. case nil, object.BasicType:
  83. x := newData(o)
  84. d := &item{}
  85. d.Data(x)
  86. il.Set(&key{id: o.Adr()}, d)
  87. case object.ArrayType, object.DynArrayType:
  88. x := newData(o)
  89. d := &item{}
  90. d.Data(x)
  91. il.Set(&key{id: o.Adr()}, d)
  92. case object.RecordType:
  93. ml := dom.Global().Discover(context.MOD).(rtm.List)
  94. x := newRec(o)
  95. d := &item{}
  96. d.Data(x)
  97. il.Set(&key{id: o.Adr()}, d)
  98. fl := make([]object.Object, 0)
  99. for rec := t; rec != nil; {
  100. for x := rec.Link(); x != nil; x = x.Link() {
  101. switch x.(type) {
  102. case object.FieldObject:
  103. //fmt.Println(o.Name(), ".", x.Name(), x.Adr())
  104. fl = append(fl, x)
  105. case object.ParameterObject, object.ProcedureObject, object.VariableObject:
  106. //do nothing
  107. default:
  108. halt.As(100, reflect.TypeOf(x))
  109. }
  110. }
  111. if rec.BaseRec() == nil {
  112. x := ml.NewTypeCalc()
  113. x.ConnectTo(rec)
  114. _, frec := x.ForeignBase()
  115. //fmt.Println(frec)
  116. rec, _ = frec.(object.RecordType)
  117. } else {
  118. rec = rec.BaseRec()
  119. }
  120. }
  121. x.fi = items.New()
  122. x.fi.Begin()
  123. for _, f := range fl {
  124. push(dom, x.fi, f)
  125. }
  126. x.fi.End()
  127. default:
  128. halt.As(100, reflect.TypeOf(t))
  129. }
  130. case object.ParameterObject:
  131. il.Hold(&key{id: o.Adr()})
  132. default:
  133. halt.As(100, reflect.TypeOf(o))
  134. }
  135. }
  136. func (a *salloc) Allocate(n node.Node, final bool) {
  137. mod := rtm.ModuleOfNode(a.area.d, n)
  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. //все объекты скоупа
  154. ol := mod.Objects[n]
  155. //добавим либо переменные внутри процедуры либо если мы создаем скоуп для модуля то процедурные объекты добавим в скиплист
  156. switch o := n.Object().(type) {
  157. case object.ProcedureObject:
  158. for l := o.Link(); l != nil; l = l.Link() {
  159. ol = append(ol, l)
  160. }
  161. case nil: //do nothing
  162. default:
  163. halt.As(100, reflect.TypeOf(o))
  164. }
  165. for _, o := range ol {
  166. switch t := o.(type) {
  167. case object.ProcedureObject:
  168. for l := t.Link(); l != nil; l = l.Link() {
  169. skip[l.Adr()] = l
  170. }
  171. skip[o.Adr()] = o
  172. case object.TypeObject:
  173. skip[o.Adr()] = o
  174. case object.ConstantObject:
  175. skip[o.Adr()] = o
  176. }
  177. }
  178. a.area.il.Begin()
  179. a.area.init = true
  180. for _, o := range ol {
  181. if skip[o.Adr()] == nil {
  182. utils.PrintScope(o.Adr(), o.Name())
  183. push(a.area.d, a.area.il, o)
  184. }
  185. }
  186. if final {
  187. a.area.il.End()
  188. a.area.init = false
  189. }
  190. }
  191. func (a *salloc) Dispose(n node.Node) {
  192. utils.PrintScope("DISPOSE")
  193. a.area.il.Drop()
  194. }
  195. func (a *salloc) proper_init(root node.Node, _val node.Node, _par object.Object, tail eval.Do, in eval.IN) eval.Do {
  196. utils.PrintScope("INITIALIZE")
  197. const link = "initialize:par"
  198. end := func(in eval.IN) eval.OUT {
  199. a.area.il.End()
  200. a.area.init = false
  201. return eval.Later(tail)
  202. }
  203. var next eval.Do
  204. do := func(val node.Node, par object.Object) (out eval.OUT) {
  205. utils.PrintScope(par.Adr(), par.Name(), ":=", reflect.TypeOf(val))
  206. out = eval.Now(next)
  207. switch par.(type) {
  208. case object.VariableObject:
  209. out = eval.GetExpression(in, link, val, func(in eval.IN) eval.OUT {
  210. it := a.area.il.Get(&key{id: par.Adr()}, items.INIT).(*item)
  211. v := it.Value().(scope.Variable)
  212. val := rt2.ValueOf(in.Frame)[eval.KeyOf(in, link)]
  213. v.Set(val)
  214. return eval.Later(next)
  215. })
  216. case object.ParameterObject:
  217. switch val.(type) {
  218. case node.Designator:
  219. out = eval.GetDesignator(in, link, val, func(in eval.IN) eval.OUT {
  220. mt := rt2.RegOf(in.Frame)[context.META].(*eval.Meta)
  221. fa := mt.Scope.(*area).il
  222. a.area.il.Link(&key{id: par.Adr()}, items.ID{In: fa, This: &key{id: mt.Id}})
  223. return eval.Later(next)
  224. })
  225. case node.Expression: //array заменяем ссылку на переменную
  226. out = eval.GetExpression(in, link, val, func(in eval.IN) eval.OUT {
  227. d := &item{}
  228. data := rt2.ValueOf(in.Frame)[eval.KeyOf(in, link)]
  229. switch data.(type) {
  230. case STRING, SHORTSTRING:
  231. val := &dynarr{link: par}
  232. val.Set(data)
  233. d.Data(val)
  234. default:
  235. halt.As(100, reflect.TypeOf(data))
  236. }
  237. a.area.il.Put(&key{id: par.Adr()}, d)
  238. return eval.Later(next)
  239. })
  240. default:
  241. halt.As(100, reflect.TypeOf(val))
  242. }
  243. default:
  244. halt.As(100, reflect.TypeOf(par))
  245. }
  246. return
  247. }
  248. val := _val
  249. par := _par
  250. next = func(eval.IN) eval.OUT {
  251. if val == nil {
  252. return eval.Later(end)
  253. } else {
  254. step := do(val, par)
  255. val = val.Link()
  256. par = par.Link()
  257. return step
  258. }
  259. }
  260. return next
  261. }
  262. func (a *salloc) Initialize(n node.Node, par scope.PARAM) (frame.Sequence, frame.WAIT) {
  263. var tail eval.Do
  264. if par.Tail != nil {
  265. tail = eval.Expose(par.Tail)
  266. } else {
  267. tail = eval.Tail(eval.STOP)
  268. }
  269. return eval.Propose(a.proper_init(n, par.Values, par.Objects, tail, eval.IN{Frame: par.Frame, Parent: par.Frame.Parent()})), frame.NOW
  270. }
  271. func (a *salloc) Join(m scope.Manager) { a.area = m.(*area) }
  272. func (a *area) Target(all ...scope.Allocator) scope.Allocator {
  273. if len(all) > 0 {
  274. a.all = all[0]
  275. }
  276. if a.all == nil {
  277. return &salloc{area: a}
  278. } else {
  279. a.all.Join(a)
  280. return a.all
  281. }
  282. }
  283. func (a *area) String() string { return "fixme" }
  284. func (a *area) Provide(x interface{}) scope.Value {
  285. switch z := x.(type) {
  286. case node.ConstantNode:
  287. return newConst(z)
  288. case object.ProcedureObject:
  289. return newProc(z)
  290. default:
  291. halt.As(100, reflect.TypeOf(z))
  292. }
  293. panic(0)
  294. }
  295. func (a *area) Init(d context.Domain) { a.d = d }
  296. func (a *area) Domain() context.Domain { return a.d }
  297. func (a *area) Handle(msg interface{}) {}
  298. func nn(role string) scope.Manager {
  299. switch role {
  300. case context.SCOPE, context.CALL:
  301. return &area{all: &salloc{}, il: items.New()}
  302. case context.HEAP:
  303. return &area{all: nil}
  304. //return &area{all: &halloc{}}
  305. default:
  306. panic(0)
  307. }
  308. }
  309. func fn(mgr scope.Manager, name string) (ret object.Object) {
  310. utils.PrintScope("FIND", name)
  311. a, ok := mgr.(*area)
  312. assert.For(ok, 20)
  313. assert.For(name != "", 21)
  314. a.il.ForEach(func(in items.Value) (ok bool) {
  315. var v scope.Value
  316. switch val := in.(type) {
  317. case *item:
  318. v = val.Value()
  319. }
  320. switch vv := v.(type) {
  321. case *data:
  322. utils.PrintScope(vv.link.Name())
  323. if vv.link.Name() == name {
  324. ret = vv.link
  325. ok = true
  326. }
  327. default:
  328. utils.PrintScope(reflect.TypeOf(vv))
  329. }
  330. return
  331. })
  332. return ret
  333. }
  334. func init() {
  335. scope.New = nn
  336. scope.FindObjByName = fn
  337. }