Add support for printing slices via print/println
With help from @aykevl.
Этот коммит содержится в:
родитель
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
предоставленный
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
предоставленный
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
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче