call.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. package rules
  2. import (
  3. "cp/node"
  4. "rt2/frame"
  5. mod "rt2/module"
  6. "rt2/nodeframe"
  7. )
  8. /**
  9. Для CallNode
  10. .Left() указывает на процедуру
  11. .Left().Object() указывает на список внутренних объектов, в т.ч. переменных
  12. .Object() указывает первый элемент из списка входных параметров/переменных,
  13. то же что и.Left().Object().Link(), далее .Link() указывает на следующие за ним входные параметры
  14. .Right() указывает на узлы, которые передаются в параметры
  15. */
  16. func callSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  17. var fu nodeframe.FrameUtils
  18. n := fu.NodeOf(f)
  19. switch n.Left().(type) {
  20. case node.ProcedureNode:
  21. m := mod.DomainModule(f.Domain())
  22. proc := m.NodeByObject(n.Left().Object())
  23. nf := fu.New(proc)
  24. f.Root().Push(nf)
  25. //передаем ссылку на цепочку значений параметров в данные фрейма входа в процедуру
  26. if (n.Right() != nil) && (proc.Object() != nil) {
  27. fu.DataOf(nf)[proc.Object()] = n.Right()
  28. }
  29. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  30. return frame.End()
  31. }
  32. ret = frame.SKIP
  33. default:
  34. panic("unknown call left")
  35. }
  36. return seq, ret
  37. }