|
@@ -18,7 +18,7 @@ func prologue(n node.Node) frame.Sequence {
|
|
|
//fmt.Println(reflect.TypeOf(n))
|
|
|
switch n.(type) {
|
|
|
case node.EnterNode:
|
|
|
- return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
|
|
|
+ return func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
|
|
|
body := fu.NodeOf(f).Right()
|
|
|
assert.For(body != nil, 40)
|
|
|
sm := scope.This(f.Domain().Discover(context.SCOPE))
|
|
@@ -29,8 +29,27 @@ func prologue(n node.Node) frame.Sequence {
|
|
|
sm.Initialize(n, n.Object().Link(), par)
|
|
|
}
|
|
|
}
|
|
|
- f.Root().Push(fu.New(body))
|
|
|
- return frame.Tail(frame.STOP), frame.SKIP
|
|
|
+ if f.Parent() != nil {
|
|
|
+ //Вход в процедуру не несет значимых действий и просто заменяет себя в цепочке родителей на своего родителя
|
|
|
+ fu.Push(fu.New(body), f.Parent())
|
|
|
+ } else {
|
|
|
+ //Особый случай, вход в модуль
|
|
|
+ fu.Push(fu.New(body), f)
|
|
|
+ }
|
|
|
+ next := n.Link()
|
|
|
+ if next != nil {
|
|
|
+ seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
|
|
|
+ if f.Parent() != nil {
|
|
|
+ f.Root().PushFor(fu.New(next), f.Parent())
|
|
|
+ } else {
|
|
|
+ f.Root().PushFor(fu.New(next), f)
|
|
|
+ }
|
|
|
+ return frame.Tail(frame.STOP), frame.SKIP
|
|
|
+ }
|
|
|
+ return seq, frame.SKIP
|
|
|
+ } else {
|
|
|
+ return frame.Tail(frame.STOP), frame.SKIP
|
|
|
+ }
|
|
|
}
|
|
|
case node.AssignNode:
|
|
|
return assignSeq
|
|
@@ -55,24 +74,31 @@ func prologue(n node.Node) frame.Sequence {
|
|
|
func epilogue(n node.Node) frame.Sequence {
|
|
|
var fu nodeframe.FrameUtils
|
|
|
switch n.(type) {
|
|
|
- case node.AssignNode, node.CallNode:
|
|
|
+ case node.AssignNode:
|
|
|
return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
|
|
|
next := n.Link()
|
|
|
if next != nil {
|
|
|
- f.Root().Push(fu.New(next))
|
|
|
+ f.Root().PushFor(fu.New(next), f.Parent())
|
|
|
}
|
|
|
return frame.End()
|
|
|
}
|
|
|
case node.EnterNode:
|
|
|
- return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
|
|
|
+ return func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
|
|
|
sm := scope.This(f.Domain().Discover(context.SCOPE))
|
|
|
sm.Dispose(n)
|
|
|
return frame.End()
|
|
|
}
|
|
|
case node.OperationNode:
|
|
|
return nil //do nothing
|
|
|
+ case node.CallNode:
|
|
|
+ return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
|
|
|
+ next := n.Link()
|
|
|
+ if next != nil {
|
|
|
+ f.Root().PushFor(fu.New(next), f.Parent())
|
|
|
+ }
|
|
|
+ return frame.End()
|
|
|
+ }
|
|
|
case node.ReturnNode:
|
|
|
- fmt.Println("return")
|
|
|
return nil
|
|
|
default:
|
|
|
fmt.Println(reflect.TypeOf(n))
|