diff options
author | Himbeer <himbeer@disroot.org> | 2024-09-06 13:19:22 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-09-06 13:56:07 +0200 |
commit | 959599b7bf803a91595375f650245609bf7a338f (patch) | |
tree | 47aafa8d49e00e45c0cb25255c8486eeec763692 /type.go | |
parent | 05c620c4d637b73f6b267ed57d5750587ccfd7a3 (diff) |
Add basic type system with only integers
This commit adds static typing with signed and unsigned integers of 8,
16, 32 and 64 bits.
Diffstat (limited to 'type.go')
-rw-r--r-- | type.go | 102 |
1 files changed, 102 insertions, 0 deletions
@@ -0,0 +1,102 @@ +// SPDX-FileCopyrightText: 2024 Himbeer <himbeer@disroot.org> +// +// SPDX-License-Identifier: GPL-3.0-or-later + +package main + +import "fmt" + +type cerType interface { + fmt.Stringer + qbeBaseType() string + qbeExtType() string + qbeABIType() string +} + +type cerInteger struct { + bits int + unsigned bool +} + +func (c cerInteger) String() string { + unsigned := "" + if c.unsigned { + unsigned = "u" + } + + return fmt.Sprintf("%sint%d", unsigned, c.bits) +} + +func (c cerInteger) qbeBaseType() string { + switch { + case c.bits > 32: + return "l" + default: + return "w" + } +} + +func (c cerInteger) qbeExtType() string { + switch { + case c.bits > 32: + return "l" + case c.bits > 16: + return "w" + case c.bits > 8: + return "h" + default: + return "b" + } +} + +func (c cerInteger) qbeABIType() string { + signedness := "s" + if c.unsigned { + signedness = "u" + } + + switch { + case c.bits > 32: + return "l" + case c.bits > 16: + return "w" + case c.bits > 8: + return signedness + "h" + default: + return signedness + "b" + } +} + +func resolveType(name string) cerType { + switch name { + case "int8": + return cerInteger{bits: 8} + case "uint8": + return cerInteger{bits: 8, unsigned: true} + case "int16": + return cerInteger{bits: 16} + case "uint16": + return cerInteger{bits: 16, unsigned: true} + case "int32": + return cerInteger{bits: 32} + case "uint32": + return cerInteger{bits: 32, unsigned: true} + case "int64": + return cerInteger{bits: 64} + case "uint64": + return cerInteger{bits: 64, unsigned: true} + default: + return nil + } +} + +var ( + cerInt8 = cerInteger{bits: 8} + cerUint8 = cerInteger{bits: 8, unsigned: true} + cerInt16 = cerInteger{bits: 16} + cerUint16 = cerInteger{bits: 16, unsigned: true} + cerInt32 = cerInteger{bits: 32} + cerUint32 = cerInteger{bits: 32, unsigned: true} + cerInt64 = cerInteger{bits: 64} + cerUint64 = cerInteger{bits: 64, unsigned: true} +) |