index.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package rules
  2. import (
  3. "fmt"
  4. "fw/cp/node"
  5. "fw/rt2"
  6. "fw/rt2/frame"
  7. "reflect"
  8. )
  9. func indexSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  10. i := rt2.NodeOf(f)
  11. switch i.Right().(type) {
  12. case node.ConstantNode:
  13. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  14. rt2.ValueOf(f.Parent())[i.Adr()] = rt2.ThisScope(f).Provide(i.Right())(nil)
  15. return frame.End()
  16. }
  17. ret = frame.NOW
  18. case node.VariableNode:
  19. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  20. sc := rt2.ScopeFor(f, i.Right().Object().Adr())
  21. rt2.ValueOf(f.Parent())[i.Adr()] = sc.Select(i.Right().Object().Adr())
  22. return frame.End()
  23. }
  24. ret = frame.NOW
  25. case node.OperationNode, node.CallNode:
  26. rt2.Push(rt2.New(i.Right()), f)
  27. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  28. return rt2.ValueOf(f)[i.Right().Adr()] != nil, 60
  29. })
  30. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  31. rt2.ValueOf(f.Parent())[i.Adr()] = rt2.ValueOf(f)[i.Right().Adr()]
  32. return frame.End()
  33. }
  34. ret = frame.LATER
  35. default:
  36. panic(fmt.Sprintln("unsupported type", reflect.TypeOf(i.Right())))
  37. }
  38. return seq, ret
  39. }