compiler: support i16 uintptr in cap builtin

Этот коммит содержится в:
Ayke van Laethem 2019-04-05 15:17:04 +02:00 коммит произвёл Ron Evans
родитель f967c6919a
коммит a965882a34

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

@ -1095,16 +1095,21 @@ 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
} }
var llvmCap llvm.Value
switch args[0].Type().(type) { switch args[0].Type().(type) {
case *types.Chan: case *types.Chan:
// Channel. Buffered channels haven't been implemented yet so always // Channel. Buffered channels haven't been implemented yet so always
// return 0. // return 0.
return llvm.ConstInt(c.intType, 0, false), nil llvmCap = llvm.ConstInt(c.intType, 0, false)
case *types.Slice: case *types.Slice:
return c.builder.CreateExtractValue(value, 2, "cap"), nil llvmCap = c.builder.CreateExtractValue(value, 2, "cap")
default: default:
return llvm.Value{}, c.makeError(pos, "todo: cap: unknown type") return llvm.Value{}, c.makeError(pos, "todo: cap: unknown type")
} }
if c.targetData.TypeAllocSize(llvmCap.Type()) < c.targetData.TypeAllocSize(c.intType) {
llvmCap = c.builder.CreateZExt(llvmCap, c.intType, "len.int")
}
return llvmCap, nil
case "close": case "close":
return llvm.Value{}, c.emitChanClose(frame, args[0]) return llvm.Value{}, c.emitChanClose(frame, args[0])
case "complex": case "complex":