diff --git a/cl/compile.go b/cl/compile.go index bc06d390..3136a2a5 100644 --- a/cl/compile.go +++ b/cl/compile.go @@ -139,7 +139,7 @@ func (p *context) compileMethods(pkg llssa.Package, typ types.Type) { // Global variable. func (p *context) compileGlobal(pkg llssa.Package, gbl *ssa.Global) { - typ := gbl.Type() + typ := globalType(gbl) name, vtype, define := p.varName(gbl.Pkg.Pkg, gbl) if vtype == pyVar || ignoreName(name) || checkCgo(gbl.Name()) { return @@ -803,4 +803,15 @@ func processPkg(ctx *context, ret llssa.Package, pkg *ssa.Package) { } } +func globalType(gbl *ssa.Global) types.Type { + t := gbl.Type() + if t, ok := t.(*types.Named); ok { + o := t.Obj() + if pkg := o.Pkg(); typepatch.IsPatched(pkg) { + return gbl.Pkg.Pkg.Scope().Lookup(o.Name()).Type() + } + } + return t +} + // ----------------------------------------------------------------------------- diff --git a/cl/import.go b/cl/import.go index d1f337cb..cf71b379 100644 --- a/cl/import.go +++ b/cl/import.go @@ -463,7 +463,7 @@ func (p *context) varOf(b llssa.Builder, v *ssa.Global) llssa.Expr { } ret := pkg.VarOf(name) if ret == nil { - ret = pkg.NewVar(name, v.Type(), llssa.Background(vtype)) + ret = pkg.NewVar(name, globalType(v), llssa.Background(vtype)) } return ret.Expr } diff --git a/internal/lib/sync/sync.go b/internal/lib/sync/sync.go index 0d229513..1ee685cd 100644 --- a/internal/lib/sync/sync.go +++ b/internal/lib/sync/sync.go @@ -58,7 +58,6 @@ type Once struct { } func (o *Once) Do(f func()) { - println("Once.Do start", o.done) if !o.done { o.m.Lock() defer o.m.Unlock() diff --git a/internal/typepatch/patch.go b/internal/typepatch/patch.go index df0f0e21..48feb73b 100644 --- a/internal/typepatch/patch.go +++ b/internal/typepatch/patch.go @@ -60,6 +60,9 @@ const ( ) func IsPatched(pkg *types.Package) bool { + if pkg == nil { + return false + } p := (*typesPackage)(unsafe.Pointer(pkg)) return *(*uint8)(unsafe.Pointer(&p.complete)) == tagPatched }