diff options
Diffstat (limited to 'llgo/irgen/value.go')
-rw-r--r-- | llgo/irgen/value.go | 34 |
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 |