1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- package rules
- import (
- "fw/cp/node"
- "fw/rt2"
- "fw/rt2/context"
- "fw/rt2/frame"
- "fw/rt2/module"
- "fw/rt2/scope"
- "fw/utils"
- )
- func enterSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
- n := rt2.NodeOf(f)
- body := rt2.NodeOf(f).Right()
- tail := func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
- if body == nil {
- //случай пустого тела процедуры/секции BEGIN
- return frame.End()
- } else if f.Parent() != nil {
- //Вход в процедуру не несет значимых действий и просто заменяет себя в цепочке родителей на своего родителя
- //При вызове фрейма с другим доменом это мешает, надо убрать
- //Через DataOf(f.Parent()) может передаваться результат выполнения
- //rt2.Push(rt2.New(body), f.Parent())
- rt2.Push(rt2.New(body), f)
- return frame.Tail(frame.STOP), frame.LATER
- } else {
- //Особый случай, вход в модуль, секция BEGIN
- rt2.Push(rt2.New(body), f)
- utils.PrintFrame("begin", module.DomainModule(f.Domain()).Name)
- //Выход из модуля, секция CLOSE
- next := n.Link()
- if next != nil {
- seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
- utils.PrintFrame("end", module.DomainModule(f.Domain()).Name)
- f.Root().PushFor(rt2.New(next), f)
- return frame.Tail(frame.STOP), frame.END
- }
- } else {
- seq = frame.Tail(frame.STOP)
- }
- return seq, frame.BEGIN
- }
- }
- sm := f.Domain().Discover(context.SCOPE).(scope.Manager)
- //fmt.Println(n.Object())
- if n.Object() != nil {
- par, ok := rt2.RegOf(f)[n.Object()].(node.Node)
- //fmt.Println(rt2.DataOf(f)[n.Object()])
- //fmt.Println(ok)
- if ok {
- sm.Target().(scope.ScopeAllocator).Allocate(n, false)
- seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
- return sm.Target().(scope.ScopeAllocator).Initialize(n,
- scope.PARAM{
- Objects: n.Object().Link(),
- Values: par,
- Frame: f,
- Tail: tail})
- }
- } else {
- sm.Target().(scope.ScopeAllocator).Allocate(n, true)
- seq = tail
- }
- } else {
- sm.Target().(scope.ScopeAllocator).Allocate(n, true)
- seq = tail
- }
- return seq, frame.NOW
- }
|