expect.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package rules
  2. import (
  3. "fmt"
  4. "fw/cp/node"
  5. "fw/cp/object"
  6. "fw/rt2"
  7. "fw/rt2/context"
  8. "fw/rt2/frame"
  9. rtm "fw/rt2/module"
  10. "fw/rt2/scope"
  11. "reflect"
  12. "ypk/assert"
  13. "ypk/halt"
  14. )
  15. //функция вернет в данные родительского фрейма вычисленное значение expr
  16. func expectExpr(parent frame.Frame, expr node.Node, next Do) OUT {
  17. assert.For(expr != nil, 20)
  18. switch e := expr.(type) {
  19. case node.ConstantNode:
  20. rt2.ValueOf(parent)[expr.Adr()] = rt2.ThisScope(parent).Provide(e)(nil)
  21. return OUT{do: next, next: NOW}
  22. case node.VariableNode, node.ParameterNode:
  23. m := rtm.ModuleOfObject(parent.Domain(), expr.Object())
  24. assert.For(m != nil, 40)
  25. imp := m.ImportOf(expr.Object())
  26. if imp != "" {
  27. // md := rtm.ModuleDomain(parent.Domain(), imp)
  28. //sm = md.Discover(context.SCOPE).(scope.Manager)
  29. fm := rtm.Module(parent.Domain(), imp)
  30. ol := fm.ObjectByName(fm.Enter, expr.Object().Name())
  31. for _, obj := range ol {
  32. if _, ok := obj.(object.VariableObject); ok {
  33. sm := rt2.ScopeFor(parent, obj.Adr())
  34. rt2.ValueOf(parent)[expr.Adr()] = sm.Select(obj.Adr())
  35. }
  36. }
  37. } else {
  38. sm := rt2.ScopeFor(parent, expr.Object().Adr())
  39. rt2.ValueOf(parent)[expr.Adr()] = sm.Select(expr.Object().Adr())
  40. }
  41. return OUT{do: next, next: NOW}
  42. case node.OperationNode, node.CallNode, node.DerefNode, node.FieldNode:
  43. rt2.Push(rt2.New(expr), parent)
  44. wait := func(...IN) OUT {
  45. if rt2.RegOf(parent)[expr] == nil && rt2.ValueOf(parent)[expr.Adr()] == nil {
  46. raw := rt2.RegOf(parent)[context.RETURN]
  47. if val, ok := raw.(scope.Value); !ok {
  48. halt.As(100, "no result from ", expr.Adr(), raw)
  49. } else {
  50. rt2.ValueOf(parent)[expr.Adr()] = val
  51. }
  52. }
  53. return OUT{do: next, next: NOW}
  54. }
  55. return OUT{do: wait, next: LATER}
  56. case node.IndexNode:
  57. rt2.Push(rt2.New(e), parent)
  58. rt2.Assert(parent, func(f frame.Frame) (bool, int) {
  59. return rt2.ValueOf(f)[e.Adr()] != nil, 64
  60. })
  61. wait := func(in ...IN) OUT {
  62. idx := rt2.ValueOf(parent)[e.Adr()]
  63. return expectExpr(in[0].frame, e.Left(), func(...IN) OUT {
  64. v := rt2.ValueOf(in[0].frame)[e.Left().Adr()]
  65. switch vv := v.(type) {
  66. case scope.Array:
  67. idx = vv.Get(idx)
  68. rt2.ValueOf(parent)[e.Adr()] = idx
  69. default:
  70. halt.As(100, reflect.TypeOf(vv), vv, rt2.ValueOf(in[0].frame))
  71. }
  72. return OUT{do: next, next: NOW}
  73. })
  74. }
  75. return OUT{do: wait, next: LATER}
  76. case node.ProcedureNode:
  77. rt2.RegOf(parent)[expr] = e.Object()
  78. return OUT{do: next, next: NOW}
  79. default:
  80. panic(fmt.Sprintln("not an expression", reflect.TypeOf(expr)))
  81. }
  82. }