// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package Universe import Globals "globals" import Object "object" import Type "type" export var ( scope *Globals.Scope; types *Globals.List; // internal types void_t, bad_t, nil_t, // basic types bool_t, uint8_t, uint16_t, uint32_t, uint64_t, int8_t, int16_t, int32_t, int64_t, float32_t, float64_t, float80_t, string_t, integer_t, any_t, // alias types byte_t, ushort_t, uint_t, ulong_t, short_t, int_t, long_t, float_t, double_t, ptrint_t *Globals.Type; true_, false_ *Globals.Object; ) func DeclObj(kind int, ident string, typ *Globals.Type) *Globals.Object { obj := Globals.NewObject(-1 /* no source pos */, kind, ident); obj.typ = typ; if kind == Object.TYPE && typ.obj == nil { typ.obj = obj; // set primary type object } scope.Insert(obj); return obj } func DeclType(form int, ident string, size int) *Globals.Type { typ := Globals.NewType(form); typ.size = size; return DeclObj(Object.TYPE, ident, typ).typ; } func DeclAlias(ident string, typ *Globals.Type) *Globals.Type { alias := Globals.NewType(Type.ALIAS); alias.aux = typ; alias.elt = typ; return DeclObj(Object.TYPE, ident, alias).typ; } func Register(typ *Globals.Type) *Globals.Type { if types.len_ < 0 { panic("types.len_ < 0"); } typ.ref = types.len_; types.AddTyp(typ); return typ; } func init() { scope = Globals.NewScope(nil); // universe has no parent types = Globals.NewList(); // Interal types void_t = Globals.NewType(Type.VOID); Globals.Universe_void_t = void_t; bad_t = Globals.NewType(Type.BAD); nil_t = DeclType(Type.NIL, "nil", 8); // Basic types bool_t = Register(DeclType(Type.BOOL, "bool", 1)); uint8_t = Register(DeclType(Type.UINT, "uint8", 1)); uint16_t = Register(DeclType(Type.UINT, "uint16", 2)); uint32_t = Register(DeclType(Type.UINT, "uint32", 4)); uint64_t = Register(DeclType(Type.UINT, "uint64", 8)); int8_t = Register(DeclType(Type.INT, "int8", 1)); int16_t = Register(DeclType(Type.INT, "int16", 2)); int32_t = Register(DeclType(Type.INT, "int32", 4)); int64_t = Register(DeclType(Type.INT, "int64", 8)); float32_t = Register(DeclType(Type.FLOAT, "float32", 4)); float64_t = Register(DeclType(Type.FLOAT, "float64", 8)); float80_t = Register(DeclType(Type.FLOAT, "float80", 10)); string_t = Register(DeclType(Type.STRING, "string", 8)); integer_t = Register(DeclType(Type.INTEGER, "integer", 8)); any_t = Register(DeclType(Type.ANY, "any", 8)); // All but 'byte' should be platform-dependent, eventually. byte_t = Register(DeclAlias("byte", uint8_t)); ushort_t = Register(DeclAlias("ushort", uint16_t)); uint_t = Register(DeclAlias("uint", uint32_t)); ulong_t = Register(DeclAlias("ulong", uint32_t)); short_t = Register(DeclAlias("short", int16_t)); int_t = Register(DeclAlias("int", int32_t)); long_t = Register(DeclAlias("long", int32_t)); float_t = Register(DeclAlias("float", float32_t)); double_t = Register(DeclAlias("double", float64_t)); ptrint_t = Register(DeclAlias("ptrint", uint64_t)); // Predeclared constants true_ = DeclObj(Object.CONST, "true", bool_t); false_ = DeclObj(Object.CONST, "false", bool_t); // Builtin functions DeclObj(Object.FUNC, "len", Globals.NewType(Type.FUNCTION)); // incomplete // scope.Print(); }