summaryrefslogtreecommitdiffstats
path: root/llgo/irgen/value.go
diff options
context:
space:
mode:
Diffstat (limited to 'llgo/irgen/value.go')
-rw-r--r--llgo/irgen/value.go34
1 files changed, 7 insertions, 27 deletions
diff --git a/llgo/irgen/value.go b/llgo/irgen/value.go
index 366069b3e10..e6bc5898e57 100644
--- a/llgo/irgen/value.go
+++ b/llgo/irgen/value.go
@@ -17,6 +17,7 @@ package irgen
import (
"fmt"
"go/token"
+
"llvm.org/llgo/third_party/gotools/go/exact"
"llvm.org/llgo/third_party/gotools/go/types"
"llvm.org/llvm/bindings/go/llvm"
@@ -480,20 +481,8 @@ func (fr *frame) convert(v *govalue, dsttyp types.Type) *govalue {
// string -> []byte
if isSlice(dsttyp, types.Byte) {
- value := v.value
- strdata := fr.builder.CreateExtractValue(value, 0, "")
- strlen := fr.builder.CreateExtractValue(value, 1, "")
-
- // Data must be copied, to prevent changes in
- // the byte slice from mutating the string.
- newdata := fr.createMalloc(strlen)
- fr.memcpy(newdata, strdata, strlen)
-
- struct_ := llvm.Undef(fr.types.ToLLVM(dsttyp))
- struct_ = fr.builder.CreateInsertValue(struct_, newdata, 0, "")
- struct_ = fr.builder.CreateInsertValue(struct_, strlen, 1, "")
- struct_ = fr.builder.CreateInsertValue(struct_, strlen, 2, "")
- return newValue(struct_, origdsttyp)
+ sliceValue := fr.runtime.stringToByteArray.callOnly(fr, v.value)[0]
+ return newValue(sliceValue, origdsttyp)
}
// string -> []rune
@@ -504,19 +493,10 @@ func (fr *frame) convert(v *govalue, dsttyp types.Type) *govalue {
// []byte -> string
if isSlice(srctyp, types.Byte) && isString(dsttyp) {
- value := v.value
- data := fr.builder.CreateExtractValue(value, 0, "")
- len := fr.builder.CreateExtractValue(value, 1, "")
-
- // Data must be copied, to prevent changes in
- // the byte slice from mutating the string.
- newdata := fr.createMalloc(len)
- fr.memcpy(newdata, data, len)
-
- struct_ := llvm.Undef(fr.types.ToLLVM(types.Typ[types.String]))
- struct_ = fr.builder.CreateInsertValue(struct_, newdata, 0, "")
- struct_ = fr.builder.CreateInsertValue(struct_, len, 1, "")
- return newValue(struct_, types.Typ[types.String])
+ data := fr.builder.CreateExtractValue(v.value, 0, "")
+ len := fr.builder.CreateExtractValue(v.value, 1, "")
+ stringValue := fr.runtime.byteArrayToString.callOnly(fr, data, len)[0]
+ return newValue(stringValue, dsttyp)
}
// []rune -> string
OpenPOWER on IntegriCloud