area.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package scope
  2. import (
  3. "fw/cp"
  4. "fw/cp/node"
  5. "fw/cp/object"
  6. "fw/rt2/context"
  7. "fw/rt2/frame"
  8. )
  9. type PARAM struct {
  10. Objects object.Object
  11. Values node.Node
  12. Frame frame.Frame
  13. Tail frame.Sequence
  14. }
  15. //менеджер зон видимости, зоны видимости динамические, создаются в момент входа в EnterNode
  16. // pk, 20150112, инициализация параметров теперь происходит как и обычный frame.Sequence, с использованием стека
  17. type Manager interface {
  18. context.ContextAware
  19. Update(id cp.ID, val ValueFor)
  20. Select(cp.ID, ...ValueOf) Value
  21. Target(...Allocator) Allocator
  22. Exists(cp.ID) bool
  23. Provide(interface{}) ValueFor
  24. String() string
  25. }
  26. type Allocator interface {
  27. Join(Manager)
  28. }
  29. type ScopeAllocator interface {
  30. Allocator
  31. Allocate(n node.Node, final bool)
  32. Dispose(n node.Node)
  33. Initialize(n node.Node, par PARAM) (frame.Sequence, frame.WAIT)
  34. }
  35. type HeapAllocator interface {
  36. Allocator
  37. Allocate(object.Object, object.PointerType, ...interface{}) ValueFor //указатель лежит в скоупе процедуры/модуля, а рекорд - в куче, поэтому нужно после создания экземпляра обновить указатель
  38. Dispose(id cp.ID)
  39. }
  40. var FindObjByName func(m Manager, name string) object.Object
  41. var New func(role string) Manager