return.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package rules
  2. import (
  3. "fmt"
  4. "fw/cp/node"
  5. "fw/rt2"
  6. "fw/rt2/context"
  7. "fw/rt2/frame"
  8. "fw/rt2/scope"
  9. "reflect"
  10. )
  11. func returnSeq(f frame.Frame) (frame.Sequence, frame.WAIT) {
  12. a := rt2.NodeOf(f)
  13. left := func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  14. switch a.Left().(type) {
  15. case node.ConstantNode:
  16. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  17. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  18. //rt2.DataOf(f.Parent())[a.Object()] = a.Left().(node.ConstantNode).Data()
  19. rt2.ValueOf(f.Parent())[a.Object().Adr()] = sc.Provide(a.Left())(nil)
  20. rt2.RegOf(f.Parent())["RETURN"] = rt2.ValueOf(f.Parent())[a.Object().Adr()]
  21. return frame.End()
  22. }
  23. ret = frame.NOW
  24. case node.VariableNode:
  25. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  26. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  27. rt2.ValueOf(f.Parent())[a.Object().Adr()] = sc.Select(a.Left().Object().Adr())
  28. rt2.RegOf(f.Parent())["RETURN"] = rt2.ValueOf(f.Parent())[a.Object().Adr()]
  29. return frame.End()
  30. }
  31. ret = frame.NOW
  32. case node.OperationNode, node.CallNode, node.FieldNode:
  33. rt2.Push(rt2.New(a.Left()), f)
  34. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  35. rt2.ValueOf(f.Parent())[a.Object().Adr()] = rt2.ValueOf(f)[a.Left().Adr()]
  36. rt2.RegOf(f.Parent())["RETURN"] = rt2.ValueOf(f)[a.Left().Adr()]
  37. if rt2.RegOf(f.Parent())["RETURN"] == nil {
  38. rt2.RegOf(f.Parent())["RETURN"] = rt2.RegOf(f)["RETURN"]
  39. }
  40. return frame.End()
  41. }
  42. ret = frame.LATER
  43. case node.IndexNode:
  44. return This(expectExpr(f, a.Left(), func(...IN) OUT {
  45. rt2.ValueOf(f.Parent())[a.Object().Adr()] = rt2.ValueOf(f)[a.Left().Adr()]
  46. rt2.RegOf(f.Parent())["RETURN"] = rt2.ValueOf(f)[a.Left().Adr()]
  47. if rt2.RegOf(f.Parent())["RETURN"] == nil {
  48. rt2.RegOf(f.Parent())["RETURN"] = rt2.RegOf(f)["RETURN"]
  49. }
  50. return End()
  51. }))
  52. default:
  53. fmt.Println(reflect.TypeOf(a.Left()))
  54. panic("wrong left")
  55. }
  56. return seq, ret
  57. }
  58. return left, frame.NOW
  59. }