compiler: simplify code for builtin len()

Strings and slices now have the len element at the same location.
Этот коммит содержится в:
Ayke van Laethem 2018-09-06 10:52:36 +02:00
родитель 31f494e611
коммит 41a50ec336
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: E97FF5335DFDFDED

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

@ -1550,14 +1550,10 @@ func (c *Compiler) parseBuiltin(frame *Frame, args []ssa.Value, callName string)
if err != nil { if err != nil {
return llvm.Value{}, err return llvm.Value{}, err
} }
switch typ := args[0].Type().(type) { switch args[0].Type().(type) {
case *types.Basic: case *types.Basic, *types.Slice:
switch typ.Kind() { // string or slice
case types.String:
return c.builder.CreateExtractValue(value, 1, "len"), nil return c.builder.CreateExtractValue(value, 1, "len"), nil
default:
return llvm.Value{}, errors.New("todo: len: unknown basic type")
}
case *types.Map: case *types.Map:
indices := []llvm.Value{ indices := []llvm.Value{
llvm.ConstInt(llvm.Int32Type(), 0, false), llvm.ConstInt(llvm.Int32Type(), 0, false),
@ -1565,8 +1561,6 @@ func (c *Compiler) parseBuiltin(frame *Frame, args []ssa.Value, callName string)
} }
ptr := c.builder.CreateGEP(value, indices, "lenptr") ptr := c.builder.CreateGEP(value, indices, "lenptr")
return c.builder.CreateLoad(ptr, "len"), nil return c.builder.CreateLoad(ptr, "len"), nil
case *types.Slice:
return c.builder.CreateExtractValue(value, 1, "len"), nil
default: default:
return llvm.Value{}, errors.New("todo: len: unknown type") return llvm.Value{}, errors.New("todo: len: unknown type")
} }