call.go 1.5 KB

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