compiler: simplify code for builtin len()
Strings and slices now have the len element at the same location.
Этот коммит содержится в:
родитель
31f494e611
коммит
41a50ec336
1 изменённых файлов: 4 добавлений и 10 удалений
12
compiler.go
12
compiler.go
|
@ -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")
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче