fix free bug when callback return object

This commit is contained in:
Star 2024-07-10 10:17:07 +08:00
parent 9e0d17f0a3
commit eddfed2284

View File

@ -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{}{}