1 // Copyright 2011 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.
5 // This file sets up the universe scope and the unsafe package.
15 // The Universe scope contains all predeclared objects of Go.
16 // It is the outermost scope of any chain of nested scopes.
19 // The Unsafe package is the package returned by an importer
20 // for the import path "unsafe".
25 universeByte
*Basic
// uint8 alias, but has name "byte"
26 universeRune
*Basic
// int32 alias, but has name "rune"
29 // Typ contains the predeclared *Basic types indexed by their
30 // corresponding BasicKind.
32 // The *Basic type for Typ[Byte] will have the name "uint8".
33 // Use Universe.Lookup("byte").Type() to obtain the specific
34 // alias basic type named "byte" (and analogous for "rune").
36 Invalid
: {Invalid
, 0, "invalid type"},
38 Bool
: {Bool
, IsBoolean
, "bool"},
39 Int
: {Int
, IsInteger
, "int"},
40 Int8
: {Int8
, IsInteger
, "int8"},
41 Int16
: {Int16
, IsInteger
, "int16"},
42 Int32
: {Int32
, IsInteger
, "int32"},
43 Int64
: {Int64
, IsInteger
, "int64"},
44 Uint
: {Uint
, IsInteger | IsUnsigned
, "uint"},
45 Uint8
: {Uint8
, IsInteger | IsUnsigned
, "uint8"},
46 Uint16
: {Uint16
, IsInteger | IsUnsigned
, "uint16"},
47 Uint32
: {Uint32
, IsInteger | IsUnsigned
, "uint32"},
48 Uint64
: {Uint64
, IsInteger | IsUnsigned
, "uint64"},
49 Uintptr
: {Uintptr
, IsInteger | IsUnsigned
, "uintptr"},
50 Float32
: {Float32
, IsFloat
, "float32"},
51 Float64
: {Float64
, IsFloat
, "float64"},
52 Complex64
: {Complex64
, IsComplex
, "complex64"},
53 Complex128
: {Complex128
, IsComplex
, "complex128"},
54 String
: {String
, IsString
, "string"},
55 UnsafePointer
: {UnsafePointer
, 0, "Pointer"},
57 UntypedBool
: {UntypedBool
, IsBoolean | IsUntyped
, "untyped bool"},
58 UntypedInt
: {UntypedInt
, IsInteger | IsUntyped
, "untyped int"},
59 UntypedRune
: {UntypedRune
, IsInteger | IsUntyped
, "untyped rune"},
60 UntypedFloat
: {UntypedFloat
, IsFloat | IsUntyped
, "untyped float"},
61 UntypedComplex
: {UntypedComplex
, IsComplex | IsUntyped
, "untyped complex"},
62 UntypedString
: {UntypedString
, IsString | IsUntyped
, "untyped string"},
63 UntypedNil
: {UntypedNil
, IsUntyped
, "untyped nil"},
66 var aliases
= [...]*Basic
{
67 {Byte
, IsInteger | IsUnsigned
, "byte"},
68 {Rune
, IsInteger
, "rune"},
71 func defPredeclaredTypes() {
72 for _
, t
:= range Typ
{
73 def(NewTypeName(token
.NoPos
, nil, t
.name
, t
))
75 for _
, t
:= range aliases
{
76 def(NewTypeName(token
.NoPos
, nil, t
.name
, t
))
79 // Error has a nil package in its qualified name since it is in no package
80 res
:= NewVar(token
.NoPos
, nil, "", Typ
[String
])
81 sig
:= &Signature
{results
: NewTuple(res
)}
82 err
:= NewFunc(token
.NoPos
, nil, "Error", sig
)
83 typ
:= &Named
{underlying
: NewInterfaceType([]*Func
{err
}, nil).Complete()}
84 sig
.recv
= NewVar(token
.NoPos
, nil, "", typ
)
85 def(NewTypeName(token
.NoPos
, nil, "error", typ
))
88 var predeclaredConsts
= [...]struct {
93 {"true", UntypedBool
, constant
.MakeBool(true)},
94 {"false", UntypedBool
, constant
.MakeBool(false)},
95 {"iota", UntypedInt
, constant
.MakeInt64(0)},
98 func defPredeclaredConsts() {
99 for _
, c
:= range predeclaredConsts
{
100 def(NewConst(token
.NoPos
, nil, c
.name
, Typ
[c
.kind
], c
.val
))
104 func defPredeclaredNil() {
105 def(&Nil
{object
{name
: "nil", typ
: Typ
[UntypedNil
], color_
: black
}})
108 // A builtinId is the id of a builtin function.
113 _Append builtinId
= iota
139 var predeclaredFuncs
= [...]struct {
145 _Append
: {"append", 1, true, expression
},
146 _Cap
: {"cap", 1, false, expression
},
147 _Close
: {"close", 1, false, statement
},
148 _Complex
: {"complex", 2, false, expression
},
149 _Copy
: {"copy", 2, false, statement
},
150 _Delete
: {"delete", 2, false, statement
},
151 _Imag
: {"imag", 1, false, expression
},
152 _Len
: {"len", 1, false, expression
},
153 _Make
: {"make", 1, true, expression
},
154 _New
: {"new", 1, false, expression
},
155 _Panic
: {"panic", 1, false, statement
},
156 _Print
: {"print", 0, true, statement
},
157 _Println
: {"println", 0, true, statement
},
158 _Real
: {"real", 1, false, expression
},
159 _Recover
: {"recover", 0, false, statement
},
161 _Alignof
: {"Alignof", 1, false, expression
},
162 _Offsetof
: {"Offsetof", 1, false, expression
},
163 _Sizeof
: {"Sizeof", 1, false, expression
},
165 _Assert
: {"assert", 1, false, statement
},
166 _Trace
: {"trace", 0, true, statement
},
169 func defPredeclaredFuncs() {
170 for i
:= range predeclaredFuncs
{
172 if id
== _Assert || id
== _Trace
{
173 continue // only define these in testing environment
179 // DefPredeclaredTestFuncs defines the assert and trace built-ins.
180 // These built-ins are intended for debugging and testing of this
182 func DefPredeclaredTestFuncs() {
183 if Universe
.Lookup("assert") != nil {
184 return // already defined
186 def(newBuiltin(_Assert
))
187 def(newBuiltin(_Trace
))
191 Universe
= NewScope(nil, token
.NoPos
, token
.NoPos
, "universe")
192 Unsafe
= NewPackage("unsafe", "unsafe")
193 Unsafe
.complete
= true
195 defPredeclaredTypes()
196 defPredeclaredConsts()
198 defPredeclaredFuncs()
200 universeIota
= Universe
.Lookup("iota").(*Const
)
201 universeByte
= Universe
.Lookup("byte").(*TypeName
).typ
.(*Basic
)
202 universeRune
= Universe
.Lookup("rune").(*TypeName
).typ
.(*Basic
)
205 // Objects with names containing blanks are internal and not entered into
206 // a scope. Objects with exported names are inserted in the unsafe package
207 // scope; other objects are inserted in the universe scope.
209 func def(obj Object
) {
210 assert(obj
.color() == black
)
212 if strings
.Contains(name
, " ") {
213 return // nothing to do
215 // fix Obj link for named types
216 if typ
, ok
:= obj
.Type().(*Named
); ok
{
217 typ
.obj
= obj
.(*TypeName
)
219 // exported identifiers go into package unsafe
224 switch obj
:= obj
.(type) {
233 if scope
.Insert(obj
) != nil {
234 panic("internal error: double declaration")