GoPLS Viewer

Home|gopls/cmd/signature-fuzzer/internal/fuzz-generator/numparm.go
1// Copyright 2021 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package generator
6
7import (
8    "bytes"
9    "fmt"
10    "math"
11)
12
13// numparm describes a numeric parameter type; it implements the
14// "parm" interface.
15type numparm struct {
16    tag         string
17    widthInBits uint32
18    ctl         bool
19    isBlank
20    addrTakenHow
21    isGenValFunc
22    skipCompare
23}
24
25var f32parm *numparm = &numparm{
26    tag:         "float",
27    widthInBitsuint32(32),
28    ctl:         false,
29}
30var f64parm *numparm = &numparm{
31    tag:         "float",
32    widthInBitsuint32(64),
33    ctl:         false,
34}
35
36func (p numparmTypeName() string {
37    if p.tag == "byte" {
38        return "byte"
39    }
40    return fmt.Sprintf("%s%d"p.tagp.widthInBits)
41}
42
43func (p numparmQualName() string {
44    return p.TypeName()
45}
46
47func (p numparmString() string {
48    if p.tag == "byte" {
49        return "byte"
50    }
51    ctl := ""
52    if p.ctl {
53        ctl = " [ctl=yes]"
54    }
55    return fmt.Sprintf("%s%s"p.TypeName(), ctl)
56}
57
58func (p numparmNumElements() int {
59    return 1
60}
61
62func (p numparmIsControl() bool {
63    return p.ctl
64}
65
66func (p numparmGenElemRef(elidx intpath string) (stringparm) {
67    return path, &p
68}
69
70func (p numparmDeclare(b *bytes.Bufferprefix stringsuffix stringcaller bool) {
71    t := fmt.Sprintf("%s%d%s"p.tagp.widthInBitssuffix)
72    if p.tag == "byte" {
73        t = fmt.Sprintf("%s%s"p.tagsuffix)
74    }
75    b.WriteString(prefix + " " + t)
76}
77
78func (p numparmgenRandNum(s *genstatevalue int) (stringint) {
79    which := uint8(s.wr.Intn(int64(100)))
80    if p.tag == "int" {
81        var v int64
82        if which < 3 {
83            // max
84            v = (1 << (p.widthInBits - 1)) - 1
85
86        } else if which < 5 {
87            // min
88            v = (-1 << (p.widthInBits - 1))
89        } else {
90            nrange := int64(1 << (p.widthInBits - 2))
91            v = s.wr.Intn(nrange)
92            if value%2 != 0 {
93                v = -v
94            }
95        }
96        return fmt.Sprintf("%s%d(%d)"p.tagp.widthInBitsv), value + 1
97    }
98    if p.tag == "uint" || p.tag == "byte" {
99        nrange := int64(1 << (p.widthInBits - 2))
100        v := s.wr.Intn(nrange)
101        if p.tag == "byte" {
102            return fmt.Sprintf("%s(%d)"p.tagv), value + 1
103        }
104        return fmt.Sprintf("%s%d(0x%x)"p.tagp.widthInBitsv), value + 1
105    }
106    if p.tag == "float" {
107        if p.widthInBits == 32 {
108            rf := s.wr.Float32() * (math.MaxFloat32 / 4)
109            if value%2 != 0 {
110                rf = -rf
111            }
112            return fmt.Sprintf("%s%d(%v)"p.tagp.widthInBitsrf), value + 1
113        }
114        if p.widthInBits == 64 {
115            return fmt.Sprintf("%s%d(%v)"p.tagp.widthInBits,
116                s.wr.NormFloat64()), value + 1
117        }
118        panic("unknown float type")
119    }
120    if p.tag == "complex" {
121        if p.widthInBits == 64 {
122            f1v2 := f32parm.genRandNum(svalue)
123            f2v3 := f32parm.genRandNum(sv2)
124            return fmt.Sprintf("complex(%s,%s)"f1f2), v3
125        }
126        if p.widthInBits == 128 {
127            f1v2 := f64parm.genRandNum(svalue)
128            f2v3 := f64parm.genRandNum(sv2)
129            return fmt.Sprintf("complex(%v,%v)"f1f2), v3
130        }
131        panic("unknown complex type")
132    }
133    panic("unknown numeric type")
134}
135
136func (p numparmGenValue(s *genstatef *funcdefvalue intcaller bool) (stringint) {
137    rnv := p.genRandNum(svalue)
138    verb(5"numparm.GenValue(%d) = %s"valuer)
139    return rnv
140}
141
142func (p numparmHasPointer() bool {
143    return false
144}
145
MembersX
numparm.QualName
numparm.Declare
numparm.Declare.suffix
numparm.genRandNum.which
numparm.genRandNum.BlockStmt.v
numparm.genRandNum.BlockStmt.BlockStmt.nrange
numparm.genRandNum.BlockStmt.BlockStmt.v2
numparm.String
numparm.NumElements
numparm.GenElemRef.p
numparm.GenElemRef.path
numparm.Declare.t
numparm.GenValue.caller
numparm.HasPointer.p
numparm.Declare.caller
numparm
numparm.tag
numparm.widthInBits
numparm.ctl
numparm.TypeName
numparm.QualName.p
numparm.Declare.b
numparm.genRandNum.p
numparm.GenValue.s
numparm.GenValue.r
numparm.IsControl.p
numparm.Declare.p
numparm.genRandNum.s
numparm.IsControl
numparm.genRandNum.BlockStmt.BlockStmt.f1
numparm.GenValue.p
numparm.GenValue
numparm.GenValue.f
math
f32parm
f64parm
numparm.TypeName.p
numparm.genRandNum
numparm.String.p
numparm.GenElemRef
numparm.Declare.prefix
numparm.genRandNum.value
numparm.genRandNum.BlockStmt.BlockStmt.v3
numparm.GenValue.value
numparm.HasPointer
numparm.String.ctl
numparm.NumElements.p
numparm.GenElemRef.elidx
numparm.genRandNum.BlockStmt.nrange
numparm.genRandNum.BlockStmt.BlockStmt.f2
numparm.GenValue.nv
Members
X