Add support for printing slices via print/println

With help from @aykevl.
Этот коммит содержится в:
Federico G. Schwindt 2022-06-22 05:21:56 -06:00 коммит произвёл Ron Evans
родитель 5fdb894760
коммит ea36fea5a9
4 изменённых файлов: 33 добавлений и 8 удалений

Просмотреть файл

@ -1541,6 +1541,12 @@ func (b *builder) createBuiltin(argTypes []types.Type, argValues []llvm.Value, c
case *types.Pointer:
ptrValue := b.CreatePtrToInt(value, b.uintptrType, "")
b.createRuntimeCall("printptr", []llvm.Value{ptrValue}, "")
case *types.Slice:
bufptr := b.CreateExtractValue(value, 0, "")
buflen := b.CreateExtractValue(value, 1, "")
bufcap := b.CreateExtractValue(value, 2, "")
ptrValue := b.CreatePtrToInt(bufptr, b.uintptrType, "")
b.createRuntimeCall("printslice", []llvm.Value{ptrValue, buflen, bufcap}, "")
default:
return llvm.Value{}, b.makeError(pos, "unknown arg type: "+typ.String())
}

Просмотреть файл

@ -39,6 +39,17 @@ func printint8(n int8) {
}
}
func printuint(n uintptr) {
switch unsafe.Sizeof(n) {
case 2:
printuint16(uint16(n))
case 4:
printuint32(uint32(n))
case 8:
printuint64(uint64(n))
}
}
func printuint16(n uint16) {
printuint32(uint32(n))
}
@ -323,14 +334,7 @@ func printitf(msg interface{}) {
// cast to underlying type
itf := *(*_interface)(unsafe.Pointer(&msg))
putchar('(')
switch unsafe.Sizeof(itf.typecode) {
case 2:
printuint16(uint16(itf.typecode))
case 4:
printuint32(uint32(itf.typecode))
case 8:
printuint64(uint64(itf.typecode))
}
printuint(uintptr(itf.typecode))
putchar(':')
print(itf.value)
putchar(')')
@ -372,3 +376,12 @@ func printbool(b bool) {
printstring("false")
}
}
func printslice(ptr, len_, cap_ uintptr) {
putchar('[')
printuint(len_)
putchar('/')
printuint(cap_)
putchar(']')
printptr(ptr)
}

4
testdata/print.go предоставленный
Просмотреть файл

@ -45,4 +45,8 @@ func main() {
// print bool
println(true, false)
// print slice
println([]byte(nil))
println([]int(nil))
}

2
testdata/print.txt предоставленный
Просмотреть файл

@ -21,3 +21,5 @@ a b c
(0:nil)
map[2]
true false
[0/0]nil
[0/0]nil