...
Source file src/cmd/compile/internal/types/scope.go
1
2
3
4
5 package types
6
7 import "cmd/internal/src"
8
9
10
11 var blockgen int32 = 1
12 var Block int32
13
14
15
16 type dsym struct {
17 sym *Sym
18 def *Node
19 block int32
20 lastlineno src.XPos
21 }
22
23
24
25 var dclstack []dsym
26
27
28
29 func Pushdcl(s *Sym) {
30 dclstack = append(dclstack, dsym{
31 sym: s,
32 def: s.Def,
33 block: s.Block,
34 lastlineno: s.Lastlineno,
35 })
36 }
37
38
39
40 func Popdcl() {
41 for i := len(dclstack); i > 0; i-- {
42 d := &dclstack[i-1]
43 s := d.sym
44 if s == nil {
45
46 Block = d.block
47 dclstack = dclstack[:i-1]
48 return
49 }
50
51 s.Def = d.def
52 s.Block = d.block
53 s.Lastlineno = d.lastlineno
54
55
56 d.sym = nil
57 d.def = nil
58 }
59 Fatalf("popdcl: no stack mark")
60 }
61
62
63 func Markdcl() {
64 dclstack = append(dclstack, dsym{
65 sym: nil,
66 block: Block,
67 })
68 blockgen++
69 Block = blockgen
70 }
71
72 func IsDclstackValid() bool {
73 for _, d := range dclstack {
74 if d.sym == nil {
75 return false
76 }
77 }
78 return true
79 }
80
81
82 func (s *Sym) PkgDef() *Node {
83 return *s.pkgDefPtr()
84 }
85
86
87 func (s *Sym) SetPkgDef(n *Node) {
88 *s.pkgDefPtr() = n
89 }
90
91 func (s *Sym) pkgDefPtr() **Node {
92
93
94 for _, d := range dclstack {
95 if s == d.sym {
96 return &d.def
97 }
98 }
99
100
101
102 return &s.Def
103 }
104
View as plain text