return.go 2.0 KB

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