代码拉取完成,页面将自动刷新
同步操作将从 landy/qlang 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
package qlang
import (
"errors"
ipt "qiniupkg.com/text/tpl.v1/interpreter"
"qiniupkg.com/text/tpl.v1/interpreter.util"
"qlang.io/exec.v2"
)
// -----------------------------------------------------------------------------
type functionInfo struct {
args []string // args[0] => function name
fnb interface{}
variadic bool
}
// -----------------------------------------------------------------------------
func (p *Compiler) memberFuncDecl() {
fnb, _ := p.gstk.Pop()
variadic := p.popArity()
arity := p.popArity()
args := p.gstk.PopFnArgs(arity + 1)
fn := &functionInfo{
args: args,
fnb: fnb,
variadic: variadic != 0,
}
p.gstk.Push(fn)
}
func (p *Compiler) addMethods(cls *exec.Class, e interpreter.Engine, members []interface{}) {
for _, val := range members {
v := val.(*functionInfo)
name := v.args[0]
v.args[0] = "this"
start, end := p.cl(e, "doc", v.fnb)
fn := exec.NewFunction(cls, start, end, v.args, v.variadic)
fn.Parent = cls.Ctx
cls.Fns[name] = fn
}
}
func (p *Compiler) fnClass(e interpreter.Engine) {
arity := p.popArity()
members := p.gstk.PopNArgs(arity)
instr := p.code.Reserve()
p.exits = append(p.exits, func() {
cls := exec.IClass()
p.addMethods(cls, e, members)
instr.Set(cls)
})
}
// InjectMethods injects some methods into a class.
//
func (p *Compiler) InjectMethods(cls *exec.Class, code []byte) (err error) {
defer func() {
if e := recover(); e != nil {
switch v := e.(type) {
case string:
err = errors.New(v)
case error:
err = v
default:
panic(e)
}
}
}()
engine, err := ipt.New(p, p.Opts)
if err != nil {
return
}
p.ipt = engine
src, err := engine.Tokenize(code, "")
if err != nil {
return
}
p.cl(engine, "methods", src)
arity := p.popArity()
members := p.gstk.PopNArgs(arity)
p.addMethods(cls, engine, members)
p.Done()
return
}
func (p *Compiler) fnNew() {
nArgs := p.popArity()
if nArgs != 0 {
nArgs = p.popArity()
}
p.code.Block(exec.INew(nArgs))
}
func (p *Compiler) memberRef(name string) {
p.code.Block(exec.MemberRef(name))
}
// -----------------------------------------------------------------------------
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。