compileBlock: use LoadPyModSyms
This commit is contained in:
@@ -328,9 +328,18 @@ func (p *context) funcOf(fn *ssa.Function) (aFn llssa.Function, pyFn llssa.PyObj
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func modOf(name string) string {
|
||||||
|
if pos := strings.LastIndexByte(name, '.'); pos > 0 {
|
||||||
|
return name[:pos]
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
func (p *context) compileBlock(b llssa.Builder, block *ssa.BasicBlock, n int, doMainInit, doModInit bool) llssa.BasicBlock {
|
func (p *context) compileBlock(b llssa.Builder, block *ssa.BasicBlock, n int, doMainInit, doModInit bool) llssa.BasicBlock {
|
||||||
var last int
|
var last int
|
||||||
var pyModInit bool
|
var pyModInit bool
|
||||||
|
var prog = p.prog
|
||||||
|
var pkg = p.pkg
|
||||||
var instrs = block.Instrs[n:]
|
var instrs = block.Instrs[n:]
|
||||||
var ret = p.fn.Block(block.Index)
|
var ret = p.fn.Block(block.Index)
|
||||||
b.SetBlock(ret)
|
b.SetBlock(ret)
|
||||||
@@ -339,9 +348,20 @@ func (p *context) compileBlock(b llssa.Builder, block *ssa.BasicBlock, n int, do
|
|||||||
last = len(instrs) - 1
|
last = len(instrs) - 1
|
||||||
instrs = instrs[:last]
|
instrs = instrs[:last]
|
||||||
}
|
}
|
||||||
|
p.inits = append(p.inits, func() {
|
||||||
|
if objs := pkg.PyObjs(); len(objs) > 0 {
|
||||||
|
mods := make(map[string][]llssa.PyObject)
|
||||||
|
for name, obj := range objs {
|
||||||
|
modName := modOf(name)
|
||||||
|
mods[modName] = append(mods[modName], obj)
|
||||||
|
}
|
||||||
|
b.SetBlockEx(ret, llssa.AtStart)
|
||||||
|
for modName, objs := range mods {
|
||||||
|
b.LoadPyModSyms(modName, objs...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
} else if doMainInit {
|
} else if doMainInit {
|
||||||
prog := p.prog
|
|
||||||
pkg := p.pkg
|
|
||||||
fn := p.fn
|
fn := p.fn
|
||||||
argc := pkg.NewVar("__llgo_argc", types.NewPointer(types.Typ[types.Int32]), llssa.InC)
|
argc := pkg.NewVar("__llgo_argc", types.NewPointer(types.Typ[types.Int32]), llssa.InC)
|
||||||
argv := pkg.NewVar("__llgo_argv", types.NewPointer(argvTy), llssa.InC)
|
argv := pkg.NewVar("__llgo_argv", types.NewPointer(argvTy), llssa.InC)
|
||||||
@@ -360,9 +380,9 @@ func (p *context) compileBlock(b llssa.Builder, block *ssa.BasicBlock, n int, do
|
|||||||
jumpTo := p.jumpTo(jump)
|
jumpTo := p.jumpTo(jump)
|
||||||
modPath := p.pyMod
|
modPath := p.pyMod
|
||||||
modName := pysymPrefix + modPath
|
modName := pysymPrefix + modPath
|
||||||
modPtr := p.pkg.NewPyModVar(modName, true).Expr
|
modPtr := pkg.NewPyModVar(modName, true).Expr
|
||||||
mod := b.Load(modPtr)
|
mod := b.Load(modPtr)
|
||||||
cond := b.BinOp(token.NEQ, mod, b.Prog.Null(mod.Type))
|
cond := b.BinOp(token.NEQ, mod, prog.Null(mod.Type))
|
||||||
newBlk := p.fn.MakeBlock()
|
newBlk := p.fn.MakeBlock()
|
||||||
b.If(cond, jumpTo, newBlk)
|
b.If(cond, jumpTo, newBlk)
|
||||||
b.SetBlock(newBlk)
|
b.SetBlock(newBlk)
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ func testCompile(t *testing.T, src, expected string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestFromTestpy(t *testing.T) {
|
func TestFromTestpy(t *testing.T) {
|
||||||
cltest.FromDir(t, "", "./_testpy", false)
|
cltest.FromDir(t, "callpy", "./_testpy", false)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFromTestlibc(t *testing.T) {
|
func TestFromTestlibc(t *testing.T) {
|
||||||
|
|||||||
@@ -557,12 +557,17 @@ func (b Builder) LoadPyModSyms(modName string, objs ...PyObject) Expr {
|
|||||||
fnLoad := pkg.pyFunc("llgoLoadPyModSyms", b.Prog.tyLoadPyModSyms())
|
fnLoad := pkg.pyFunc("llgoLoadPyModSyms", b.Prog.tyLoadPyModSyms())
|
||||||
modPtr := pkg.NewPyModVar(modName, false).Expr
|
modPtr := pkg.NewPyModVar(modName, false).Expr
|
||||||
mod := b.Load(modPtr)
|
mod := b.Load(modPtr)
|
||||||
args := make([]Expr, 1, len(objs)*2+1)
|
args := make([]Expr, 1, len(objs)*2+2)
|
||||||
args[0] = mod
|
args[0] = mod
|
||||||
|
nbase := len(modName) + 1
|
||||||
for _, o := range objs {
|
for _, o := range objs {
|
||||||
args = append(args, b.CStr(o.impl.Name()))
|
fullName := o.impl.Name()
|
||||||
|
name := fullName[nbase:]
|
||||||
|
args = append(args, b.CStr(name))
|
||||||
args = append(args, o.Expr)
|
args = append(args, o.Expr)
|
||||||
}
|
}
|
||||||
|
prog := b.Prog
|
||||||
|
args = append(args, prog.Null(prog.CStr()))
|
||||||
return b.Call(fnLoad, args...)
|
return b.Call(fnLoad, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user