Add builtin len(string)
Этот коммит содержится в:
родитель
013b375904
коммит
850fef9852
2 изменённых файлов: 23 добавлений и 1 удалений
|
@ -18,11 +18,16 @@ func main() {
|
||||||
println("3 + 12 =", add(3, 12))
|
println("3 + 12 =", add(3, 12))
|
||||||
println("fib(11) =", fib(11))
|
println("fib(11) =", fib(11))
|
||||||
println("sumrange(100) =", sumrange(100))
|
println("sumrange(100) =", sumrange(100))
|
||||||
|
println("strlen foo:", strlen("foo"))
|
||||||
|
|
||||||
thing := Thing{"foo"}
|
thing := Thing{"foo"}
|
||||||
println("thing:", thing.String())
|
println("thing:", thing.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func strlen(s string) int {
|
||||||
|
return len(s)
|
||||||
|
}
|
||||||
|
|
||||||
func calculateAnswer() int {
|
func calculateAnswer() int {
|
||||||
seven := 7
|
seven := 7
|
||||||
return SIX * seven
|
return SIX * seven
|
||||||
|
|
19
tgo.go
19
tgo.go
|
@ -76,7 +76,7 @@ func NewCompiler(pkgName, triple string) (*Compiler, error) {
|
||||||
c.intType = llvm.Int32Type()
|
c.intType = llvm.Int32Type()
|
||||||
c.stringLenType = llvm.Int32Type()
|
c.stringLenType = llvm.Int32Type()
|
||||||
|
|
||||||
// Length-prefixed string.
|
// Go string: tuple of (len, ptr)
|
||||||
c.stringType = llvm.StructType([]llvm.Type{c.stringLenType, llvm.PointerType(llvm.Int8Type(), 0)}, false)
|
c.stringType = llvm.StructType([]llvm.Type{c.stringLenType, llvm.PointerType(llvm.Int8Type(), 0)}, false)
|
||||||
|
|
||||||
printstringType := llvm.FunctionType(llvm.VoidType(), []llvm.Type{c.stringType}, false)
|
printstringType := llvm.FunctionType(llvm.VoidType(), []llvm.Type{c.stringType}, false)
|
||||||
|
@ -427,6 +427,23 @@ func (c *Compiler) parseBuiltin(frame *Frame, instr *ssa.CallCommon, call *ssa.B
|
||||||
c.builder.CreateCall(c.printnlFunc, nil, "")
|
c.builder.CreateCall(c.printnlFunc, nil, "")
|
||||||
}
|
}
|
||||||
return llvm.Value{}, nil // print() or println() returns void
|
return llvm.Value{}, nil // print() or println() returns void
|
||||||
|
case "len":
|
||||||
|
arg := instr.Args[0]
|
||||||
|
value, err := c.parseExpr(frame, arg)
|
||||||
|
if err != nil {
|
||||||
|
return llvm.Value{}, err
|
||||||
|
}
|
||||||
|
switch typ := arg.Type().(type) {
|
||||||
|
case *types.Basic:
|
||||||
|
switch typ.Kind() {
|
||||||
|
case types.String:
|
||||||
|
return c.builder.CreateExtractValue(value, 0, "len"), nil
|
||||||
|
default:
|
||||||
|
return llvm.Value{}, errors.New("todo: len: unknown basic type")
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return llvm.Value{}, errors.New("todo: len: unknown type")
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return llvm.Value{}, errors.New("todo: builtin: " + name)
|
return llvm.Value{}, errors.New("todo: builtin: " + name)
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче