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: case *types.Pointer:
ptrValue := b.CreatePtrToInt(value, b.uintptrType, "") ptrValue := b.CreatePtrToInt(value, b.uintptrType, "")
b.createRuntimeCall("printptr", []llvm.Value{ptrValue}, "") 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: default:
return llvm.Value{}, b.makeError(pos, "unknown arg type: "+typ.String()) 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) { func printuint16(n uint16) {
printuint32(uint32(n)) printuint32(uint32(n))
} }
@ -323,14 +334,7 @@ func printitf(msg interface{}) {
// cast to underlying type // cast to underlying type
itf := *(*_interface)(unsafe.Pointer(&msg)) itf := *(*_interface)(unsafe.Pointer(&msg))
putchar('(') putchar('(')
switch unsafe.Sizeof(itf.typecode) { printuint(uintptr(itf.typecode))
case 2:
printuint16(uint16(itf.typecode))
case 4:
printuint32(uint32(itf.typecode))
case 8:
printuint64(uint64(itf.typecode))
}
putchar(':') putchar(':')
print(itf.value) print(itf.value)
putchar(')') putchar(')')
@ -372,3 +376,12 @@ func printbool(b bool) {
printstring("false") 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 // print bool
println(true, false) println(true, false)
// print slice
println([]byte(nil))
println([]int(nil))
} }

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

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