expect.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package rules
  2. import (
  3. "fmt"
  4. "fw/cp/node"
  5. "fw/rt2"
  6. "fw/rt2/frame"
  7. "fw/rt2/scope"
  8. "reflect"
  9. "ypk/assert"
  10. )
  11. //функция вернет в данные родительского фрейма вычисленное значение expr
  12. func expectExpr(parent frame.Frame, expr node.Node, next Do) OUT {
  13. assert.For(expr != nil, 20)
  14. sm := rt2.ScopeOf(parent)
  15. switch e := expr.(type) {
  16. case node.ConstantNode:
  17. rt2.ValueOf(parent)[expr.Adr()] = sm.Provide(e)(nil)
  18. return OUT{do: next, next: NOW}
  19. case node.VariableNode, node.ParameterNode:
  20. rt2.ValueOf(parent)[expr.Adr()] = sm.Select(expr.Object().Adr())
  21. return OUT{do: next, next: NOW}
  22. case node.OperationNode, node.CallNode, node.DerefNode:
  23. rt2.Push(rt2.New(expr), parent)
  24. wait := func(...IN) OUT {
  25. if rt2.RegOf(parent)[expr] == nil && rt2.ValueOf(parent)[expr.Adr()] == nil {
  26. panic("no result")
  27. }
  28. return OUT{do: next, next: NOW}
  29. }
  30. return OUT{do: wait, next: LATER}
  31. case node.IndexNode:
  32. rt2.Push(rt2.New(e), parent)
  33. rt2.Assert(parent, func(f frame.Frame) (bool, int) {
  34. return rt2.ValueOf(f)[e.Adr()] != nil, 64
  35. })
  36. wait := func(...IN) OUT {
  37. idx := rt2.ValueOf(parent)[e.Adr()]
  38. arr := sm.Select(e.Left().Object().Adr()).(scope.Array)
  39. idx = arr.Get(idx)
  40. rt2.ValueOf(parent)[e.Adr()] = idx
  41. return OUT{do: next, next: NOW}
  42. }
  43. return OUT{do: wait, next: LATER}
  44. case node.ProcedureNode:
  45. rt2.RegOf(parent)[expr] = e.Object()
  46. return OUT{do: next, next: NOW}
  47. default:
  48. panic(fmt.Sprintln("not an expression", reflect.TypeOf(expr)))
  49. }
  50. }