From 2bebf11d41e1d03bd7f7b56d3e6cd62f99b85d0e Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Thu, 30 Oct 2025 23:47:56 +0900 Subject: [PATCH] fixing the gc issues in go wrapper code --- hawk-inst.go | 30 +++++----- hawk.go | 155 +++++++++++++++++++++++++++++++++++++++++++++------ lib/Hawk.hpp | 20 +++---- lib/fnc.c | 2 +- lib/hawk.c | 23 ++++---- lib/hawk.h | 62 ++++++++++----------- lib/parse.c | 39 ++++++------- lib/run.c | 68 +++++++++++----------- 8 files changed, 261 insertions(+), 138 deletions(-) diff --git a/hawk-inst.go b/hawk-inst.go index 77e25dec..f9a23610 100644 --- a/hawk-inst.go +++ b/hawk-inst.go @@ -4,29 +4,33 @@ package hawk #include */ import "C" -import ( - "sync" -) +import "sync" +import "weak" type Instance struct { c *C.hawk_t // c object - g *Hawk // go object + //g *Hawk // go object + g weak.Pointer[Hawk] // go object } type InstanceTable struct { mtx sync.Mutex insts []Instance free_slots []int + next int } +var inst_table InstanceTable + func (itab *InstanceTable) add_instance(c *C.hawk_t, g *Hawk) int { + var n int + itab.mtx.Lock() defer itab.mtx.Unlock() - var n int = len(itab.free_slots) - + n = len(itab.free_slots) if n <= 0 { // no free slots - itab.insts = append(itab.insts, Instance{c: c, g: g}) + itab.insts = append(itab.insts, Instance{c: c, g: weak.Make(g)}) return len(itab.insts) - 1 } else { var slot int @@ -39,21 +43,19 @@ func (itab *InstanceTable) add_instance(c *C.hawk_t, g *Hawk) int { } func (itab *InstanceTable) delete_instance(slot int) Instance { - var ( - h Instance - n int - ) + var h Instance + var n int itab.mtx.Lock() defer itab.mtx.Unlock() h = itab.insts[slot] itab.insts[slot].c = nil - itab.insts[slot].g = nil + itab.insts[slot].g = weak.Make((*Hawk)(nil)) // this may not even be necessary as it's a weak pointer n = len(itab.insts) - if slot == n-1 { - itab.insts = itab.insts[:n-1] + if slot == n - 1 { + itab.insts = itab.insts[:n - 1] } else { itab.free_slots = append(itab.free_slots, slot) } diff --git a/hawk.go b/hawk.go index dd671dc3..8302abe5 100644 --- a/hawk.go +++ b/hawk.go @@ -19,6 +19,12 @@ static void init_parsestd_for_file_in(hawk_parsestd_t* in, hawk_bch_t* path) in[0].u.fileb.cmgr = HAWK_NULL; in[1].type = HAWK_PARSESTD_NULL; } + +static hawk_ooch_t* valtostr_out_cpldup(hawk_rtx_valtostr_out_t* out, hawk_oow_t* len) +{ + *len = out->u.cpldup.len; + return out->u.cpldup.ptr; +} */ import "C" @@ -27,8 +33,11 @@ import "runtime" import "unsafe" type Hawk struct { - c *C.hawk_t + c *C.hawk_t inst_no int + + rtx_head *Rtx + rtx_tail *Rtx } type Ext struct { @@ -44,14 +53,31 @@ type Err struct { type Rtx struct { c *C.hawk_rtx_t + h *Hawk + + next *Rtx + prev *Rtx +} + +type Val struct { + c *C.hawk_val_t + rtx *Rtx } type BitMask C.hawk_bitmask_t -var inst_table InstanceTable - func deregister_instance(g *Hawk) { + for g.rtx_head != nil { + g.rtx_head.Close() + } + + if g.c != nil { +fmt.Printf ("CLOSING g.c\n") + C.hawk_close(g.c) + g.c = nil + } if g.inst_no >= 0 { +fmt.Printf ("DELETING instance g\n") inst_table.delete_instance(g.inst_no) g.inst_no = -1 } @@ -73,7 +99,7 @@ func New() (*Hawk, error) { ext = (*Ext)(unsafe.Pointer(C.hawk_getxtn(c))) g = &Hawk{c: c, inst_no: -1} - + runtime.SetFinalizer(g, deregister_instance) g.inst_no = inst_table.add_instance(c, g) ext.inst_no = g.inst_no @@ -83,13 +109,16 @@ func New() (*Hawk, error) { func (hawk *Hawk) Close() { // TODO: close all rtx? - C.hawk_close(hawk.c) + //if hawk.c != nil { + // C.hawk_close(hawk.c) + // hawk.c = nil + //} deregister_instance(hawk) } func (hawk *Hawk) make_errinfo() *Err { /* - var errinf C.hawk_erruinf_t + var errinf C.hawk_erruinf_t var err Err C.hawk_geterruinf(hawk.c, &errinf) @@ -174,12 +203,12 @@ func (hawk *Hawk) AddGlobal(name string) error { var x C.int x = C.hawk_addgblwithbcstr(hawk.c, C.CString(name)) if x <= -1 { return hawk.make_errinfo() } - return nil + return nil } func (hawk *Hawk) ParseFile(text string) error { var x C.int - var in [2]C.hawk_parsestd_t + var in [2]C.hawk_parsestd_t C.init_parsestd_for_file_in(&in[0], C.CString(text)) x = C.hawk_parsestd(hawk.c, &in[0], nil) if x <= -1 { return hawk.make_errinfo() } @@ -188,7 +217,7 @@ func (hawk *Hawk) ParseFile(text string) error { func (hawk *Hawk) ParseText(text string) error { var x C.int - var in [2]C.hawk_parsestd_t + var in [2]C.hawk_parsestd_t C.init_parsestd_for_text_in(&in[0], C.CString(text), C.hawk_oow_t(len(text))) x = C.hawk_parsestd(hawk.c, &in[0], nil) @@ -196,6 +225,35 @@ func (hawk *Hawk) ParseText(text string) error { return nil } +func (hawk *Hawk) chain_rtx(rtx *Rtx) { + if hawk.rtx_head == nil { + rtx.prev = nil + hawk.rtx_head = rtx + } else { + rtx.prev = hawk.rtx_tail + hawk.rtx_tail.next = rtx + } + rtx.next = nil + hawk.rtx_tail = rtx +} + +func (hawk *Hawk) unchain_rtx(rtx *Rtx) { + if rtx.prev == nil { + hawk.rtx_head = rtx.next + } else { + rtx.prev.next = rtx.next + } + + if rtx.next == nil { + hawk.rtx_tail = rtx.prev + } else { + rtx.next.prev = rtx.prev + } + + rtx.next = nil + rtx.prev = nil +} + // ----------------------------------------------------------- func (hawk *Hawk) NewRtx(id string) (*Rtx, error) { @@ -205,13 +263,15 @@ func (hawk *Hawk) NewRtx(id string) (*Rtx, error) { rtx = C.hawk_rtx_openstdwithbcstr(hawk.c, 0, C.CString(id), nil, nil, nil) if rtx == nil { return nil, hawk.make_errinfo() } - g = &Rtx{c: rtx} + g = &Rtx{c: rtx, h: hawk} + hawk.chain_rtx(g) return g, nil } func (rtx* Rtx) Close() { + rtx.h.unchain_rtx(rtx) C.hawk_rtx_close(rtx.c) - // TODO: may need deregister?? +fmt.Printf("RTX CLOSING %p\n", rtx) } func (rtx *Rtx) make_errinfo() *Err { @@ -234,16 +294,18 @@ func (rtx *Rtx) make_errinfo() *Err { return &err } -func (rtx *Rtx) Call(name string) error { +func (rtx *Rtx) Call(name string) (*Val, error) { var fun *C.hawk_fun_t var val *C.hawk_val_t fun = C.hawk_rtx_findfunwithbcstr(rtx.c, C.CString(name)) - if fun == nil { return rtx.make_errinfo() } + if fun == nil { return nil, rtx.make_errinfo() } val = C.hawk_rtx_callfun(rtx.c, fun, nil, 0) - if val == nil { return rtx.make_errinfo() } -// TODO: convert val to Val object - return nil + if val == nil { return nil, rtx.make_errinfo() } + + // hawk_rtx_callfun() returns a value with the reference count incremented. + // i create a Val object without incrementing the reference count of val. + return &Val{rtx: rtx, c: val}, nil } // ----------------------------------------------------------- @@ -317,7 +379,7 @@ func c_to_go(c *C.hawk_t) *Hawk { ext = (*Ext)(unsafe.Pointer(C.hawk_getxtn(c))) inst = inst_table.slot_to_instance(ext.inst_no) - return inst.g + return inst.g.Value() } // ----------------------------------------------------------- @@ -325,3 +387,62 @@ func c_to_go(c *C.hawk_t) *Hawk { func (err* Err) Error() string { return fmt.Sprintf("%s[%d,%d] %s", err.File, err.Line, err.Colm, err.Msg) } + +// ----------------------------------------------------------- + +func deref_val(v *Val) { + C.hawk_rtx_refdownval(v.rtx.c, v.c) +} + +func (rtx *Rtx) NewValFromInt(v int) (*Val, error) { + var c *C.hawk_val_t + var vv *Val + + c = C.hawk_rtx_makeintval(rtx.c, C.hawk_int_t(v)) + if c == nil { return nil, rtx.make_errinfo() } + + C.hawk_rtx_refupval(rtx.c, c) + vv = &Val{rtx: rtx, c: c} + runtime.SetFinalizer(vv, deref_val) + + return vv, nil +} + +func (val* Val) ToInt() (int, error) { + var v C.hawk_int_t + var x C.int + + x = C.hawk_rtx_valtoint(val.rtx.c, val.c, &v) + if x <= -1 { return 0, val.rtx.make_errinfo() } + + return int(v), nil +} + +/* +func (val* Val) ToFlt() (double, error) { + var v C.hawk_flt_t + var x C.int + + x = C.hawk_rtx_valtoflt(val.rtx.c, val.c, &v) + if x <= -1 { return 0, val.rtx.make_errinfo() } + + return double(v), nil +}*/ + +func (val* Val) ToStr() (string, error) { + var out C.hawk_rtx_valtostr_out_t + var ptr *C.hawk_ooch_t + var len C.hawk_oow_t + var v string + var x C.int + + out._type = C.HAWK_RTX_VALTOSTR_CPLDUP + x = C.hawk_rtx_valtostr(val.rtx.c, val.c, &out) + if x <= -1 { return "", val.rtx.make_errinfo() } + + ptr = C.valtostr_out_cpldup(&out, &len) + v = string(uchars_to_rune_slice(ptr, uintptr(len))) + C.hawk_rtx_freemem(val.rtx.c, unsafe.Pointer(ptr)) + + return v, nil +} diff --git a/lib/Hawk.hpp b/lib/Hawk.hpp index df2fcad2..9598622c 100644 --- a/lib/Hawk.hpp +++ b/lib/Hawk.hpp @@ -843,24 +843,24 @@ public: /// /// The following will end up in a segmentation fault or the like. /// HAWK::HawkStd hawk; - /// hawk.open(); - /// HAWK::HawkStd::SourceString in("BEGIN{}"); - /// hawk.parse(in, HAWK::Hawk::Source::NONE); + /// hawk.open(); + /// HAWK::HawkStd::SourceString in("BEGIN{}"); + /// hawk.parse(in, HAWK::Hawk::Source::NONE); /// HAWK::Hawk::Value v(rtx); - /// v.setMbs("hello", 5); - /// hawk.close(); + /// v.setMbs("hello", 5); + /// hawk.close(); /// /// You don't call hawk.close() and rely on the destructor or /// enclose 'v' in another nested scope. /// HAWK::HawkStd hawk; - /// hawk.open(); - /// HAWK::HawkStd::SourceString in("BEGIN{}"); - /// hawk.parse(in, HAWK::Hawk::Source::NONE); + /// hawk.open(); + /// HAWK::HawkStd::SourceString in("BEGIN{}"); + /// hawk.parse(in, HAWK::Hawk::Source::NONE); /// { /// HAWK::Hawk::Value v(rtx); - /// v.setMbs("hello", 5); + /// v.setMbs("hello", 5); /// } - /// hawk.close(); + /// hawk.close(); /// class HAWK_EXPORT Value { diff --git a/lib/fnc.c b/lib/fnc.c index 1f9788c3..96e1b3f7 100644 --- a/lib/fnc.c +++ b/lib/fnc.c @@ -2335,7 +2335,7 @@ static HAWK_INLINE int asort_compare_ud (const void* x1, const void* x2, void* c args[0] = *(hawk_val_t**)x1; args[1] = *(hawk_val_t**)x2; r = hawk_rtx_callfun(cud->rtx, cud->fun, args, 2); - if (!r) return -1; + if (HAWK_UNLIKELY(!r)) return -1; if (hawk_rtx_valtoint(cud->rtx, r, &rv) <= -1) return -1; *cv = rv; return 0; diff --git a/lib/hawk.c b/lib/hawk.c index 05f2368a..cefbc3cb 100644 --- a/lib/hawk.c +++ b/lib/hawk.c @@ -68,7 +68,7 @@ static void fini_token (hawk_tok_t* tok) static void clear_token (hawk_tok_t* tok) { - if (tok->name) hawk_ooecs_clear (tok->name); + if (tok->name) hawk_ooecs_clear(tok->name); tok->type = 0; tok->loc.file = HAWK_NULL; tok->loc.line = 0; @@ -105,7 +105,7 @@ hawk_t* hawk_open (hawk_mmgr_t* mmgr, hawk_oow_t xtnsize, hawk_cmgr_t* cmgr, con void hawk_close (hawk_t* hawk) { - hawk_fini (hawk); + hawk_fini(hawk); HAWK_MMGR_FREE(hawk_getmmgr(hawk), hawk); } @@ -290,11 +290,11 @@ void hawk_fini (hawk_t* hawk) hawk_ecb_t* ecb, * ecb_next; int i; - hawk_clear (hawk); - /*hawk_clrfnc (hawk);*/ + hawk_clear(hawk); + /*hawk_clrfnc(hawk);*/ if (hawk->log.len > 0) - { + { int shuterr = hawk->shuterr; hawk->shuterr = 1; hawk->prm.logwrite(hawk, hawk->log.last_mask, hawk->log.ptr, hawk->log.len); @@ -310,7 +310,6 @@ void hawk_fini (hawk_t* hawk) do { ecb = hawk_popecb(hawk); } while (ecb); HAWK_ASSERT (hawk->ecb == (hawk_ecb_t*)hawk); - hawk_rbt_close(hawk->modtab); hawk_htb_close(hawk->fnc.user); @@ -394,13 +393,13 @@ void hawk_clear (hawk_t* hawk) hawk->haltall = 0; - clear_token (&hawk->tok); - clear_token (&hawk->ntok); - clear_token (&hawk->ptok); + clear_token(&hawk->tok); + clear_token(&hawk->ntok); + clear_token(&hawk->ptok); /* clear all loaded modules */ - hawk_rbt_walk (hawk->modtab, unload_module, hawk); - hawk_rbt_clear (hawk->modtab); + hawk_rbt_walk(hawk->modtab, unload_module, hawk); + hawk_rbt_clear(hawk->modtab); HAWK_ASSERT (HAWK_ARR_SIZE(hawk->parse.gbls) == hawk->tree.ngbls); /* delete all non-builtin global variables */ @@ -462,7 +461,7 @@ void hawk_clear (hawk_t* hawk) /* this table must not be cleared here as there can be a reference * to an entry of this table from errinf.loc.file when hawk_parse() * failed. this table is cleared in hawk_parse(). - * hawk_claersionames (hawk); + * hawk_claersionames(hawk); */ } diff --git a/lib/hawk.h b/lib/hawk.h index e4b449b8..3b02d1fe 100644 --- a/lib/hawk.h +++ b/lib/hawk.h @@ -59,12 +59,12 @@ * hawk_sio_cbs_t sio; // need to initialize it with callback functions * hawk_rio_cbs_t rio; // need to initialize it with callback functions * hawk = hawk_open(mmgr, 0, hawk_get_cmgr_by_id(HAWK_CMGR_UTF8), prm, HAWK_NULL); // create an interpreter - * hawk_parse(hawk, &sio); // parse a script + * hawk_parse(hawk, &sio); // parse a script * rtx = hawk_rtx_open(hawk, 0, &rio); // create a runtime context * retv = hawk_rtx_loop(rtx); // run a standard AWK loop * if (retv) hawk_rtx_refdownval(rtx, retv); // free return value * hawk_rtx_close(rtx); // destroy the runtime context - * hawk_close(hawk); // destroy the interpreter + * hawk_close(hawk); // destroy the interpreter * \endcode * * It provides an interface to change the conventional behavior of the @@ -2101,8 +2101,8 @@ HAWK_EXPORT int hawk_parse ( * n = hawk_parsestd(hawk, in, &out); * if (n >= 0) * { - * hawk_printf (HAWK_T("%s\n"), out.u.str.ptr); - * HAWK_MMGR_FREE (out.u.str.ptr); + * hawk_printf(HAWK_T("%s\n"), out.u.str.ptr); + * hawk_freemem(hawk, out.u.str.ptr); * } * \endcode */ @@ -2177,7 +2177,7 @@ HAWK_EXPORT int hawk_findmodsymflt ( static HAWK_INLINE void* hawk_allocmem (hawk_t* hawk, hawk_oow_t size) { return hawk_gem_allocmem(hawk_getgem(hawk), size); } static HAWK_INLINE void* hawk_reallocmem (hawk_t* hawk, void* ptr, hawk_oow_t size) { return hawk_gem_reallocmem(hawk_getgem(hawk), ptr, size); } static HAWK_INLINE void* hawk_callocmem (hawk_t* hawk, hawk_oow_t size) { return hawk_gem_callocmem(hawk_getgem(hawk), size); } -static HAWK_INLINE void hawk_freemem (hawk_t* hawk, void* ptr) { hawk_gem_freemem (hawk_getgem(hawk), ptr); } +static HAWK_INLINE void hawk_freemem (hawk_t* hawk, void* ptr) { hawk_gem_freemem(hawk_getgem(hawk), ptr); } #else #define hawk_allocmem(hawk, size) hawk_gem_allocmem(hawk_getgem(hawk), size) #define hawk_reallocmem(hawk, ptr, size) hawk_gem_reallocmem(hawk_getgem(hawk), ptr, size) @@ -2477,9 +2477,9 @@ static HAWK_INLINE void hawk_rtx_setcmgr (hawk_rtx_t* rtx, hawk_cmgr_t* cmgr) { * rtx = hawk_rtx_open(hawk, 0, rio); * if (rtx) * { - * retv = hawk_rtx_loop (rtx); - * if (retv) hawk_rtx_refdownval (rtx, retv); - * hawk_rtx_close (rtx); + * retv = hawk_rtx_loop(rtx); + * if (retv) hawk_rtx_refdownval(rtx, retv); + * hawk_rtx_close(rtx); * } * \endcode * @@ -2538,11 +2538,11 @@ HAWK_EXPORT hawk_val_t* hawk_rtx_callfun ( * rtx = hawk_rtx_open(hawk, 0, rio); * if (rtx) * { - * v = hawk_rtx_callwithucstr (rtx, HAWK_UT("init"), HAWK_NULL, 0); - * if (v) hawk_rtx_refdownval (rtx, v); - * hawk_rtx_callwithucstr (rtx, HAWK_UT("fini"), HAWK_NULL, 0); - * if (v) hawk_rtx_refdownval (rtx, v); - * hawk_rtx_close (rtx); + * v = hawk_rtx_callwithucstr(rtx, HAWK_UT("init"), HAWK_NULL, 0); + * if (v) hawk_rtx_refdownval(rtx, v); + * hawk_rtx_callwithucstr(rtx, HAWK_UT("fini"), HAWK_NULL, 0); + * if (v) hawk_rtx_refdownval(rtx, v); + * hawk_rtx_close(rtx); * } * \endcode * @@ -2566,11 +2566,11 @@ HAWK_EXPORT hawk_val_t* hawk_rtx_callwithucstr ( * rtx = hawk_rtx_open(hawk, 0, rio); * if (rtx) * { - * v = hawk_rtx_callwithbcstr (rtx, HAWK_BT("init"), HAWK_NULL, 0); - * if (v) hawk_rtx_refdownval (rtx, v); - * hawk_rtx_callwithbcstr (rtx, HAWK_BT("fini"), HAWK_NULL, 0); - * if (v) hawk_rtx_refdownval (rtx, v); - * hawk_rtx_close (rtx); + * v = hawk_rtx_callwithbcstr(rtx, HAWK_BT("init"), HAWK_NULL, 0); + * if (v) hawk_rtx_refdownval(rtx, v); + * hawk_rtx_callwithbcstr(rtx, HAWK_BT("fini"), HAWK_NULL, 0); + * if (v) hawk_rtx_refdownval(rtx, v); + * hawk_rtx_close(rtx); * } * \endcode * @@ -3498,8 +3498,8 @@ HAWK_EXPORT int hawk_rtx_valtobool ( * out.type = HAWK_RTX_VALTOSTR_CPLCPY; * out.u.cplcpy.ptr = buf; * out.u.cplcpy.len = HAWK_COUNTOF(buf); - * if (hawk_rtx_valtostr (rtx, v, &out) <= -1) goto oops; - * hawk_printf (HAWK_T("%.*s\n"), out.u.cplcpy.len, out.u.cplcpy.ptr); + * if (hawk_rtx_valtostr(rtx, v, &out) <= -1) goto oops; + * hawk_printf(HAWK_T("%.*s\n"), out.u.cplcpy.len, out.u.cplcpy.ptr); * \endcode * * #HAWK_RTX_VALTOSTR_CPL is different from #HAWK_RTX_VALTOSTR_CPLCPY @@ -3512,8 +3512,8 @@ HAWK_EXPORT int hawk_rtx_valtobool ( * out.type = HAWK_RTX_VALTOSTR_CPL; * out.u.cpl.ptr = buf; * out.u.cpl.len = HAWK_COUNTOF(buf); - * if (hawk_rtx_valtostr (rtx, v, &out) <= -1) goto oops; - * hawk_printf (HAWK_T("%.*s\n"), ut.u.cpl.len, out.u.cpl.ptr); + * if (hawk_rtx_valtostr(rtx, v, &out) <= -1) goto oops; + * hawk_printf(HAWK_T("%.*s\n"), ut.u.cpl.len, out.u.cpl.ptr); * \endcode * * When unsure of the size of the string after conversion, you can use @@ -3522,9 +3522,9 @@ HAWK_EXPORT int hawk_rtx_valtobool ( * \code * hawk_rtx_valtostr_out_t out; * out.type = HAWK_RTX_VALTOSTR_CPLDUP; - * if (hawk_rtx_valtostr (rtx, v, &out) <= -1) goto oops; - * hawk_printf (HAWK_T("%.*s\n"), out.u.cpldup.len, out.u.cpldup.ptr); - * hawk_rtx_free (rtx, out.u.cpldup.ptr); + * if (hawk_rtx_valtostr(rtx, v, &out) <= -1) goto oops; + * hawk_printf(HAWK_T("%.*s\n"), out.u.cpldup.len, out.u.cpldup.ptr); + * hawk_rtx_freemem(rtx, out.u.cpldup.ptr); * \endcode * * You may like to store the result in a dynamically resizable string. @@ -3532,12 +3532,12 @@ HAWK_EXPORT int hawk_rtx_valtobool ( * \code * hawk_rtx_valtostr_out_t out; * hawk_ooecs_t str; - * hawk_str_init (&str, hawk_rtx_getmmgr(rtx), 100); + * hawk_str_init(&str, hawk_rtx_getmmgr(rtx), 100); * out.type = HAWK_RTX_VALTOSTR_STRP; * out.u.strp = str; - * if (hawk_rtx_valtostr (rtx, v, &out) <= -1) goto oops; - * hawk_printf (HAWK_T("%.*s\n"), HAWK_STR_LEN(out.u.strp), HAWK_STR_PTR(out.u.strp)); - * hawk_str_fini (&str); + * if (hawk_rtx_valtostr(rtx, v, &out) <= -1) goto oops; + * hawk_printf(HAWK_T("%.*s\n"), HAWK_STR_LEN(out.u.strp), HAWK_STR_PTR(out.u.strp)); + * hawk_str_fini(&str); * \endcode * * If you want to append the converted string to an existing dynamically @@ -3568,8 +3568,8 @@ HAWK_EXPORT int hawk_rtx_valtostr ( * \code * ptr = hawk_rtx_valtoucstrdupwithcmgr(rtx, v, &len, hawk_rtx_getcmgr(rtx)); * if (!str) handle_error(); - * hawk_printf (HAWK_T("%.*ls\n"), (int)len, ptr); - * hawk_rtx_free (rtx, ptr); + * hawk_printf(HAWK_T("%.*ls\n"), (int)len, ptr); + * hawk_rtx_freemem(rtx, ptr); * \endcode * * \return character pointer to a duplicated string on success, diff --git a/lib/parse.c b/lib/parse.c index baab5f8e..63aa2a91 100644 --- a/lib/parse.c +++ b/lib/parse.c @@ -633,7 +633,7 @@ oops: if (hawk->sio.inf(hawk, HAWK_SIO_CMD_CLOSE, hawk->sio.inp, HAWK_NULL, 0) != 0 && ret == 0) ret = -1; /* clear the parse tree partially constructed on error */ - if (ret <= -1) hawk_clear (hawk); + if (ret <= -1) hawk_clear(hawk); return ret; } @@ -943,7 +943,7 @@ static int parse_progunit (hawk_t* hawk) ngbls = hawk->tree.ngbls; if (collect_globals(hawk) == HAWK_NULL) { - hawk_arr_delete (hawk->parse.gbls, ngbls, HAWK_ARR_SIZE(hawk->parse.gbls) - ngbls); + hawk_arr_delete(hawk->parse.gbls, ngbls, HAWK_ARR_SIZE(hawk->parse.gbls) - ngbls); hawk->tree.ngbls = ngbls; return -1; } @@ -1368,11 +1368,12 @@ static hawk_nde_t* parse_function (hawk_t* hawk) /* duplicate the name before it's overridden by get_token() */ name.ptr = hawk_dupoochars(hawk, name.ptr, name.len); - if (!name.ptr) + if (HAWK_UNLIKELY(!name.ptr)) { ADJERR_LOC(hawk, &hawk->tok.loc); return HAWK_NULL; } + /* == from this point, failure must jump to oops to free name.ptr == */ /* get the next token */ if (get_token(hawk) <= -1) goto oops; @@ -1543,7 +1544,7 @@ static hawk_nde_t* parse_function (hawk_t* hawk) * for some reasons - might be needed for better deparsing output */ nargs = HAWK_ARR_SIZE(hawk->parse.params); /* parameter names are not required anymore. clear them */ - hawk_arr_clear (hawk->parse.params); + hawk_arr_clear(hawk->parse.params); fun = (hawk_fun_t*)hawk_callocmem(hawk, HAWK_SIZEOF(*fun)); if (HAWK_UNLIKELY(!fun)) @@ -1577,7 +1578,7 @@ static hawk_nde_t* parse_function (hawk_t* hawk) hawk_freemem(hawk, name.ptr); /* remove an undefined function call entry from the parse.fun table */ - hawk_htb_delete (hawk->parse.funs, fun->name.ptr, name.len); + hawk_htb_delete(hawk->parse.funs, fun->name.ptr, name.len); return body; oops: @@ -1585,7 +1586,7 @@ oops: if (argspec) hawk_freemem(hawk, argspec); if (fun) hawk_freemem(hawk, fun); hawk_freemem(hawk, name.ptr); - hawk_arr_clear (hawk->parse.params); + hawk_arr_clear(hawk->parse.params); return HAWK_NULL; } @@ -1730,13 +1731,13 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int flags) /* @local ... */ if (get_token(hawk) <= -1) { - hawk_arr_delete (hawk->parse.lcls, nlcls_outer, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls_outer); + hawk_arr_delete(hawk->parse.lcls, nlcls_outer, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls_outer); return HAWK_NULL; } if (collect_locals(hawk, nlcls_outer, flags) == HAWK_NULL) { - hawk_arr_delete (hawk->parse.lcls, nlcls_outer, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls_outer); + hawk_arr_delete(hawk->parse.lcls, nlcls_outer, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls_outer); return HAWK_NULL; } } @@ -1757,7 +1758,7 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int flags) /* if EOF is met before the right brace, this is an error */ if (MATCH(hawk,TOK_EOF)) { - hawk_arr_delete (hawk->parse.lcls, nlcls_outer, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls_outer); + hawk_arr_delete(hawk->parse.lcls, nlcls_outer, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls_outer); if (head) hawk_clrpt(hawk, head); hawk_seterrnum(hawk, &hawk->tok.loc, HAWK_EEOF); return HAWK_NULL; @@ -1768,7 +1769,7 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int flags) { if (get_token(hawk) <= -1) { - hawk_arr_delete (hawk->parse.lcls, nlcls_outer, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls_outer); + hawk_arr_delete(hawk->parse.lcls, nlcls_outer, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls_outer); if (head) hawk_clrpt(hawk, head); return HAWK_NULL; } @@ -1808,7 +1809,7 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int flags) if (HAWK_UNLIKELY(!nde)) { - hawk_arr_delete (hawk->parse.lcls, nlcls_outer, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls_outer); + hawk_arr_delete(hawk->parse.lcls, nlcls_outer, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls_outer); if (head) hawk_clrpt(hawk, head); return HAWK_NULL; } @@ -1835,7 +1836,7 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int flags) block = (hawk_nde_blk_t*)hawk_callocmem(hawk, HAWK_SIZEOF(*block)); if (HAWK_UNLIKELY(!block)) { - hawk_arr_delete (hawk->parse.lcls, nlcls_outer, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls_outer); + hawk_arr_delete(hawk->parse.lcls, nlcls_outer, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls_outer); hawk_clrpt(hawk, head); ADJERR_LOC(hawk, xloc); return HAWK_NULL; @@ -1845,7 +1846,7 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int flags) if (tmp > hawk->parse.nlcls_max) hawk->parse.nlcls_max = tmp; /* remove all lcls to move them up to the top level */ - hawk_arr_delete (hawk->parse.lcls, nlcls_outer, tmp - nlcls_outer); + hawk_arr_delete(hawk->parse.lcls, nlcls_outer, tmp - nlcls_outer); /* adjust the number of lcls for a block without any statements */ /* if (head == HAWK_NULL) tmp = 0; */ @@ -5087,7 +5088,7 @@ static hawk_nde_t* parse_primary_rex (hawk_t* hawk, const hawk_loc_t* xloc) * of the context-sensitivity of the slash symbol. * if TOK_DIV is seen as a primary, it tries to compile * it as a regular expression */ - hawk_ooecs_clear (hawk->tok.name); + hawk_ooecs_clear(hawk->tok.name); if (MATCH(hawk,TOK_DIV_ASSN) && hawk_ooecs_ccat(hawk->tok.name, HAWK_T('=')) == (hawk_oow_t)-1) { @@ -7055,7 +7056,7 @@ retry: } while (n >= 1); - hawk_ooecs_clear (tok->name); + hawk_ooecs_clear(tok->name); tok->flags = 0; tok->loc.file = hawk->sio.last.file; tok->loc.line = hawk->sio.last.line; @@ -7349,7 +7350,7 @@ static int get_token (hawk_t* hawk) hawk->ptok.loc.file = hawk->tok.loc.file; hawk->ptok.loc.line = hawk->tok.loc.line; hawk->ptok.loc.colm = hawk->tok.loc.colm; - hawk_ooecs_swap (hawk->ptok.name, hawk->tok.name); + hawk_ooecs_swap(hawk->ptok.name, hawk->tok.name); if (HAWK_OOECS_LEN(hawk->ntok.name) > 0) { @@ -7359,8 +7360,8 @@ static int get_token (hawk_t* hawk) hawk->tok.loc.line = hawk->ntok.loc.line; hawk->tok.loc.colm = hawk->ntok.loc.colm; - hawk_ooecs_swap (hawk->tok.name, hawk->ntok.name); - hawk_ooecs_clear (hawk->ntok.name); + hawk_ooecs_swap(hawk->tok.name, hawk->ntok.name); + hawk_ooecs_clear(hawk->ntok.name); return 0; } @@ -7562,7 +7563,7 @@ static int deparse (hawk_t* hawk) df.tmp_len = HAWK_COUNTOF(tmp); df.ret = 0; - hawk_htb_walk (hawk->tree.funs, deparse_func, &df); + hawk_htb_walk(hawk->tree.funs, deparse_func, &df); if (df.ret <= -1) EXIT_DEPARSE (); for (nde = hawk->tree.begin; nde != HAWK_NULL; nde = nde->next) diff --git a/lib/run.c b/lib/run.c index 85a945b7..60226590 100644 --- a/lib/run.c +++ b/lib/run.c @@ -834,7 +834,7 @@ static hawk_rbt_walk_t fini_module (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair, void return HAWK_RBT_WALK_STOP; md = (hawk_mod_data_t*)HAWK_RBT_VPTR(pair); - if (md->mod.fini) md->mod.fini (&md->mod, mfc->rtx); + if (md->mod.fini) md->mod.fini(&md->mod, mfc->rtx); mfc->count++; return HAWK_RBT_WALK_FORWARD; @@ -893,7 +893,7 @@ hawk_rtx_t* hawk_rtx_open (hawk_t* hawk, hawk_oow_t xtnsize, hawk_rio_cbs_t* rio mic.count = 0; mic.rtx = rtx; - hawk_rbt_walk (rtx->hawk->modtab, init_module, &mic); + hawk_rbt_walk(rtx->hawk->modtab, init_module, &mic); if (mic.count != HAWK_RBT_SIZE(rtx->hawk->modtab)) { if (mic.count > 0) @@ -901,7 +901,7 @@ hawk_rtx_t* hawk_rtx_open (hawk_t* hawk, hawk_oow_t xtnsize, hawk_rio_cbs_t* rio struct module_fini_ctx_t mfc; mfc.limit = mic.count; mfc.count = 0; - hawk_rbt_walk (rtx->hawk->modtab, fini_module, &mfc); + hawk_rbt_walk(rtx->hawk->modtab, fini_module, &mfc); } fini_rtx(rtx, 1); @@ -940,7 +940,7 @@ void hawk_rtx_close (hawk_rtx_t* rtx) mfc.limit = 0; mfc.count = 0; mfc.rtx = rtx; - hawk_rbt_walk (rtx->hawk->modtab, fini_module, &mfc); + hawk_rbt_walk(rtx->hawk->modtab, fini_module, &mfc); for (ecb = rtx->ecb; ecb != (hawk_rtx_ecb_t*)rtx; ecb = ecb_next) { @@ -959,7 +959,7 @@ void hawk_rtx_close (hawk_rtx_t* rtx) */ fini_rtx(rtx, 1); - hawk_freemem (hawk_rtx_gethawk(rtx), rtx); + hawk_freemem(hawk_rtx_gethawk(rtx), rtx); } void hawk_rtx_halt (hawk_rtx_t* rtx) @@ -1023,7 +1023,7 @@ static void free_namedval (hawk_htb_t* map, void* dptr, hawk_oow_t dlen) static void same_namedval (hawk_htb_t* map, void* dptr, hawk_oow_t dlen) { - hawk_rtx_refdownval_nofree (*(hawk_rtx_t**)hawk_htb_getxtn(map), dptr); + hawk_rtx_refdownval_nofree(*(hawk_rtx_t**)hawk_htb_getxtn(map), dptr); } static int init_rtx (hawk_rtx_t* rtx, hawk_t* hawk, hawk_rio_cbs_t* rio) @@ -1048,7 +1048,7 @@ static int init_rtx (hawk_rtx_t* rtx, hawk_t* hawk, hawk_rio_cbs_t* rio) rtx->_gem = hawk->_gem; rtx->hawk = hawk; - CLRERR (rtx); + CLRERR(rtx); stack_limit = hawk->parse.pragma.rtx_stack_limit > 0? hawk->parse.pragma.rtx_stack_limit: hawk->opt.rtx_stack_limit; if (stack_limit < HAWK_MIN_RTX_STACK_LIMIT) stack_limit = HAWK_MIN_RTX_STACK_LIMIT; @@ -1147,27 +1147,27 @@ oops_14: oops_13: hawk_rtx_freemem(rtx, rtx->format.tmp.ptr); oops_12: - hawk_htb_close (rtx->named); + hawk_htb_close(rtx->named); oops_11: - hawk_ooecs_fini (&rtx->fnc.oout); + hawk_ooecs_fini(&rtx->fnc.oout); oops_10: - hawk_becs_fini (&rtx->fnc.bout); + hawk_becs_fini(&rtx->fnc.bout); oops_9: - hawk_becs_fini (&rtx->formatmbs.fmt); + hawk_becs_fini(&rtx->formatmbs.fmt); oops_8: - hawk_becs_fini (&rtx->formatmbs.out); + hawk_becs_fini(&rtx->formatmbs.out); oops_7: - hawk_ooecs_fini (&rtx->format.fmt); + hawk_ooecs_fini(&rtx->format.fmt); oops_6: - hawk_ooecs_fini (&rtx->format.out); + hawk_ooecs_fini(&rtx->format.out); oops_5: - hawk_becs_fini (&rtx->inrec.linegb); + hawk_becs_fini(&rtx->inrec.linegb); oops_4: - hawk_ooecs_fini (&rtx->inrec.lineg); + hawk_ooecs_fini(&rtx->inrec.lineg); oops_3: - hawk_ooecs_fini (&rtx->inrec.linew); + hawk_ooecs_fini(&rtx->inrec.linew); oops_2: - hawk_ooecs_fini (&rtx->inrec.line); + hawk_ooecs_fini(&rtx->inrec.line); oops_1: hawk_rtx_freemem(rtx, rtx->stack); oops_0: @@ -1249,20 +1249,20 @@ static void fini_rtx (hawk_rtx_t* rtx, int fini_globals) rtx->gbl.subsep.len = 0; } - hawk_ooecs_fini (&rtx->fnc.oout); - hawk_becs_fini (&rtx->fnc.bout); + hawk_ooecs_fini(&rtx->fnc.oout); + hawk_becs_fini(&rtx->fnc.bout); hawk_rtx_freemem(rtx, rtx->formatmbs.tmp.ptr); rtx->formatmbs.tmp.ptr = HAWK_NULL; rtx->formatmbs.tmp.len = 0; - hawk_becs_fini (&rtx->formatmbs.fmt); - hawk_becs_fini (&rtx->formatmbs.out); + hawk_becs_fini(&rtx->formatmbs.fmt); + hawk_becs_fini(&rtx->formatmbs.out); hawk_rtx_freemem(rtx, rtx->format.tmp.ptr); rtx->format.tmp.ptr = HAWK_NULL; rtx->format.tmp.len = 0; - hawk_ooecs_fini (&rtx->format.fmt); - hawk_ooecs_fini (&rtx->format.out); + hawk_ooecs_fini(&rtx->format.fmt); + hawk_ooecs_fini(&rtx->format.out); /* destroy input record. hawk_rtx_clrrec() should be called * before the stack has been destroyed because it may try @@ -1274,10 +1274,10 @@ static void fini_rtx (hawk_rtx_t* rtx, int fini_globals) rtx->inrec.flds = HAWK_NULL; rtx->inrec.maxflds = 0; } - hawk_becs_fini (&rtx->inrec.linegb); - hawk_ooecs_fini (&rtx->inrec.lineg); - hawk_ooecs_fini (&rtx->inrec.linew); - hawk_ooecs_fini (&rtx->inrec.line); + hawk_becs_fini(&rtx->inrec.linegb); + hawk_ooecs_fini(&rtx->inrec.lineg); + hawk_ooecs_fini(&rtx->inrec.linew); + hawk_ooecs_fini(&rtx->inrec.line); if (fini_globals) refdown_globals(rtx, 1); @@ -8275,7 +8275,7 @@ static hawk_ooch_t* idxnde_to_str (hawk_rtx_t* rtx, hawk_nde_t* nde, hawk_ooch_t idx = eval_expression(rtx, nde); if (HAWK_UNLIKELY(!idx)) { - hawk_ooecs_fini (&idxstr); + hawk_ooecs_fini(&idxstr); return HAWK_NULL; } @@ -8286,7 +8286,7 @@ static hawk_ooch_t* idxnde_to_str (hawk_rtx_t* rtx, hawk_nde_t* nde, hawk_ooch_t if (hawk_rtx_valtoint(rtx, idx, &idxint) <= -1) { hawk_rtx_refdownval(rtx, idx); - hawk_ooecs_fini (&idxstr); + hawk_ooecs_fini(&idxstr); ADJERR_LOC(rtx, &nde->loc); return HAWK_NULL; } @@ -8297,7 +8297,7 @@ static hawk_ooch_t* idxnde_to_str (hawk_rtx_t* rtx, hawk_nde_t* nde, hawk_ooch_t if (xnde != nde && hawk_ooecs_ncat(&idxstr, rtx->gbl.subsep.ptr, rtx->gbl.subsep.len) == (hawk_oow_t)-1) { hawk_rtx_refdownval(rtx, idx); - hawk_ooecs_fini (&idxstr); + hawk_ooecs_fini(&idxstr); ADJERR_LOC(rtx, &nde->loc); return HAWK_NULL; } @@ -8305,7 +8305,7 @@ static hawk_ooch_t* idxnde_to_str (hawk_rtx_t* rtx, hawk_nde_t* nde, hawk_ooch_t if (hawk_rtx_valtostr(rtx, idx, &out) <= -1) { hawk_rtx_refdownval(rtx, idx); - hawk_ooecs_fini (&idxstr); + hawk_ooecs_fini(&idxstr); ADJERR_LOC(rtx, &nde->loc); return HAWK_NULL; } @@ -8314,11 +8314,11 @@ static hawk_ooch_t* idxnde_to_str (hawk_rtx_t* rtx, hawk_nde_t* nde, hawk_ooch_t nde = nde->next; } - hawk_ooecs_yield (&idxstr, &tmp, 0); + hawk_ooecs_yield(&idxstr, &tmp, 0); str = tmp.ptr; *len = tmp.len; - hawk_ooecs_fini (&idxstr); + hawk_ooecs_fini(&idxstr); /* if nde is not HAWK_NULL, it should be of the HAWK_NDE_NULL type */ *remidx = nde? nde->next: nde;