ssa: program.Closure, removeCtx for MakeClosure

This commit is contained in:
visualfc
2024-10-30 10:42:32 +08:00
parent df7e8b2e64
commit 014bdb795f
3 changed files with 6 additions and 9 deletions

View File

@@ -179,7 +179,7 @@ func (b diBuilder) createType(name string, ty Type, pos token.Position) DIType {
case *types.Struct:
return b.createStructType(name, ty, pos)
case *types.Signature:
tyFn := b.prog.Closure(ty)
tyFn := b.prog.Closure(t)
return b.createFuncPtrType(name, tyFn, pos)
case *types.Array:
return b.createArrayType(ty, t.Len())
@@ -600,7 +600,7 @@ func (b Builder) doConstructDebugAddr(v Expr, t types.Type) (dbgPtr Expr, dbgVal
case *types.Slice:
ty = b.Prog.Type(b.Prog.rtType("Slice").RawType().Underlying(), InGo)
case *types.Signature:
ty = b.Prog.Closure(b.Prog.rawType(t))
ty = b.Prog.Closure(t)
case *types.Named:
ty = b.Prog.Type(t.Underlying(), InGo)
case *types.Map:

View File

@@ -924,19 +924,17 @@ func (b Builder) MakeClosure(fn Expr, bindings []Expr) Expr {
tctx := sig.Params().At(0).Type().Underlying().(*types.Pointer).Elem().(*types.Struct)
flds := llvmFields(bindings, tctx, b)
data := b.aggregateAllocU(prog.rawType(tctx), flds...)
return b.aggregateValue(closureType(prog, sig), fn.impl, data)
return b.aggregateValue(prog.Closure(removeCtx(sig)), fn.impl, data)
}
func closureType(p Program, sig *types.Signature) Type {
func removeCtx(sig *types.Signature) *types.Signature {
params := sig.Params()
n := params.Len()
args := make([]*types.Var, n-1)
for i := 0; i < n-1; i++ {
args[i] = params.At(i + 1)
}
sig = types.NewSignature(sig.Recv(), types.NewTuple(args...), sig.Results(), sig.Variadic())
closure := p.gocvt.cvtClosure(sig)
return p.rawType(closure)
return types.NewSignature(sig.Recv(), types.NewTuple(args...), sig.Results(), sig.Variadic())
}
// -----------------------------------------------------------------------------

View File

@@ -67,8 +67,7 @@ func (p Program) FuncDecl(sig *types.Signature, bg Background) Type {
}
// Closure creates a closture type for a function.
func (p Program) Closure(fn Type) Type {
sig := fn.raw.Type.(*types.Signature)
func (p Program) Closure(sig *types.Signature) Type {
closure := p.gocvt.cvtClosure(sig)
return p.rawType(closure)
}