channel.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package vrp
  2. import (
  3. "fmt"
  4. "honnef.co/go/tools/ssa"
  5. )
  6. type ChannelInterval struct {
  7. Size IntInterval
  8. }
  9. func (c ChannelInterval) Union(other Range) Range {
  10. i, ok := other.(ChannelInterval)
  11. if !ok {
  12. i = ChannelInterval{EmptyIntInterval}
  13. }
  14. if c.Size.Empty() || !c.Size.IsKnown() {
  15. return i
  16. }
  17. if i.Size.Empty() || !i.Size.IsKnown() {
  18. return c
  19. }
  20. return ChannelInterval{
  21. Size: c.Size.Union(i.Size).(IntInterval),
  22. }
  23. }
  24. func (c ChannelInterval) String() string {
  25. return c.Size.String()
  26. }
  27. func (c ChannelInterval) IsKnown() bool {
  28. return c.Size.IsKnown()
  29. }
  30. type MakeChannelConstraint struct {
  31. aConstraint
  32. Buffer ssa.Value
  33. }
  34. type ChannelChangeTypeConstraint struct {
  35. aConstraint
  36. X ssa.Value
  37. }
  38. func NewMakeChannelConstraint(buffer, y ssa.Value) Constraint {
  39. return &MakeChannelConstraint{NewConstraint(y), buffer}
  40. }
  41. func NewChannelChangeTypeConstraint(x, y ssa.Value) Constraint {
  42. return &ChannelChangeTypeConstraint{NewConstraint(y), x}
  43. }
  44. func (c *MakeChannelConstraint) Operands() []ssa.Value { return []ssa.Value{c.Buffer} }
  45. func (c *ChannelChangeTypeConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} }
  46. func (c *MakeChannelConstraint) String() string {
  47. return fmt.Sprintf("%s = make(chan, %s)", c.Y().Name(), c.Buffer.Name())
  48. }
  49. func (c *ChannelChangeTypeConstraint) String() string {
  50. return fmt.Sprintf("%s = changetype(%s)", c.Y().Name(), c.X.Name())
  51. }
  52. func (c *MakeChannelConstraint) Eval(g *Graph) Range {
  53. i, ok := g.Range(c.Buffer).(IntInterval)
  54. if !ok {
  55. return ChannelInterval{NewIntInterval(NewZ(0), PInfinity)}
  56. }
  57. if i.Lower.Sign() == -1 {
  58. i.Lower = NewZ(0)
  59. }
  60. return ChannelInterval{i}
  61. }
  62. func (c *ChannelChangeTypeConstraint) Eval(g *Graph) Range { return g.Range(c.X) }