fix free bug when callback return object
This commit is contained in:
parent
9e0d17f0a3
commit
eddfed2284
19
bridge.go
19
bridge.go
@ -473,12 +473,17 @@ func _makeFromJsValue(in quickjs.Value, parent quickjs.Value, key string, n int,
|
||||
funcCode := in.String()
|
||||
funcId := ""
|
||||
if !jsFuncNameMatcher.MatchString(funcCode) {
|
||||
anonymousFuncIndex := u.Uint64(ctx.GetData("anonymousFuncIndex")) + 1
|
||||
ctx.SetData("anonymousFuncIndex", anonymousFuncIndex)
|
||||
funcId = "_func_" + u.String(anonymousFuncIndex) + "_" + u.ShortUniqueId()
|
||||
jsCtx.Eval("var " + funcId + " = " + funcCode)
|
||||
funcId = u.String(ctx.GetData("_func_" + funcCode))
|
||||
if funcId == "" {
|
||||
anonymousFuncIndex := u.Uint64(ctx.GetData("anonymousFuncIndex")) + 1
|
||||
ctx.SetData("anonymousFuncIndex", anonymousFuncIndex)
|
||||
funcId = "_func_" + u.String(anonymousFuncIndex) + "_" + u.ShortUniqueId()
|
||||
ctx.SetData("_func_"+funcCode, funcId)
|
||||
jsCtx.Eval("var " + funcId + " = " + funcCode)
|
||||
}
|
||||
}
|
||||
return func(args ...interface{}) interface{} {
|
||||
// 匿名函数从全局变量获得(命名函数可直接获得)
|
||||
if !in.IsFunction() && funcId != "" {
|
||||
in2 := jsCtx.Globals().Get(funcId)
|
||||
if freeJsValues, ok := ctx.GetData("_freeJsValues").(*[]quickjs.Value); ok {
|
||||
@ -488,6 +493,7 @@ func _makeFromJsValue(in quickjs.Value, parent quickjs.Value, key string, n int,
|
||||
in = in2
|
||||
}
|
||||
}
|
||||
|
||||
jsIn := make([]quickjs.Value, len(args))
|
||||
for i, arg := range args {
|
||||
jsIn[i] = MakeJsValue(ctx, arg, false)
|
||||
@ -503,8 +509,9 @@ func _makeFromJsValue(in quickjs.Value, parent quickjs.Value, key string, n int,
|
||||
} else {
|
||||
jsOut = jsCtx.Invoke(in, jsCtx.Null(), jsIn...)
|
||||
}
|
||||
//fmt.Println(u.BBlue(">>>>>>>2 "), in.IsFunction(), jsOut.IsError(), jsOut.IsException(), jsCtx.Exception(), u.JsonP(MakeFromJsValue(jsOut, ctx)), 2222)
|
||||
return MakeFromJsValue(jsOut, ctx)
|
||||
out := MakeFromJsValue(jsOut, ctx)
|
||||
jsOut.Free()
|
||||
return out
|
||||
}
|
||||
} else if in.IsObject() {
|
||||
o := map[string]interface{}{}
|
||||
|
Loading…
Reference in New Issue
Block a user