compiler,runtime: implement string to []rune conversion

Commit message by aykevl
Этот коммит содержится в:
scriptonist 2019-06-11 21:56:28 +05:30 коммит произвёл Ayke van Laethem
родитель fa5855bff5
коммит e9f6e51fc8
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: E97FF5335DFDFDED
4 изменённых файлов: 35 добавлений и 1 удалений

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

@ -2458,8 +2458,10 @@ func (c *Compiler) parseConvert(typeFrom, typeTo types.Type, value llvm.Value, p
switch elemType.Kind() {
case types.Byte:
return c.createRuntimeCall("stringToBytes", []llvm.Value{value}, ""), nil
case types.Rune:
return c.createRuntimeCall("stringToRunes", []llvm.Value{value}, ""), nil
default:
return llvm.Value{}, c.makeError(pos, "todo: convert from string: "+elemType.String())
panic("unexpected type in string to slice conversion")
}
default:

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

@ -89,6 +89,21 @@ func stringToBytes(x _string) (slice struct {
return
}
// Convert a string to []rune slice.
func stringToRunes(s string) []rune {
var n = 0
for range s {
n++
}
var r = make([]rune, n)
n = 0
for _, e := range s {
r[n] = e
n++
}
return r
}
// Create a string from a Unicode code point.
func stringFromUnicode(x rune) _string {
array, length := encodeUTF8(x)

8
testdata/rangestring.go → testdata/string.go предоставленный
Просмотреть файл

@ -6,6 +6,14 @@ func testRangeString() {
}
}
func testStringToRunes() {
var s = "abcü¢€𐍈°x"
for i,c := range []rune(s) {
println(i, c)
}
}
func main() {
testRangeString()
testStringToRunes()
}

9
testdata/rangestring.txt → testdata/string.txt предоставленный
Просмотреть файл

@ -7,3 +7,12 @@
10 66376
14 176
16 120
0 97
1 98
2 99
3 252
4 162
5 8364
6 66376
7 176
8 120