diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2021-09-26 13:12:02 -0700 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2021-09-26 13:12:02 -0700 |
| commit | 77d9007a88a18e0dee08aa9ba93e3aec86375572 (patch) | |
| tree | 5dddf51ce1dfba7fe5272fc024bb839868a789ab /Lua | |
| parent | ee0174001b385944c6a2b3b1fb6ba861613cb4f7 (diff) | |
Refactor of pat_t memory management to use doubly linked lists, and
moving the recursive freeing code from Lua/lbp.c into pattern.c
Diffstat (limited to 'Lua')
| -rw-r--r-- | Lua/lbp.c | 40 |
1 files changed, 2 insertions, 38 deletions
@@ -112,41 +112,6 @@ static void push_match(lua_State *L, match_t *m, const char *start) lua_setfield(L, -2, "after"); } -static void recursively_free_pat(pat_t *pat) -{ - // Do a depth-first traversal, freeing everyting along the way: - if (!pat) return; - switch (pat->type) { - case BP_DEFINITION: - recursively_free_pat(pat->args.def.def); - recursively_free_pat(pat->args.def.pat); - break; - case BP_REPEAT: - recursively_free_pat(pat->args.repetitions.sep); - recursively_free_pat(pat->args.repetitions.repeat_pat); - break; - case BP_CHAIN: case BP_UPTO: case BP_UPTO_STRICT: - case BP_OTHERWISE: case BP_NOT_MATCH: case BP_MATCH: - recursively_free_pat(pat->args.multiple.first); - recursively_free_pat(pat->args.multiple.second); - break; - case BP_REPLACE: - recursively_free_pat(pat->args.replace.pat); - break; - case BP_CAPTURE: - recursively_free_pat(pat->args.capture.capture_pat); - break; - case BP_NOT: case BP_AFTER: case BP_BEFORE: - recursively_free_pat(pat->args.pat); - break; - case BP_LEFTRECURSION: - recursively_free_pat(pat->args.leftrec.fallback); - break; - default: break; - } - free_pat(pat); -} - static int Lmatch(lua_State *L) { if (lua_isstring(L, 1)) { @@ -226,7 +191,7 @@ static int Lreplace(lua_State *L) lua_pushinteger(L, replacements); fclose(out); - free_pat(maybe_replacement.value.pat); + delete_pat(&maybe_replacement.value.pat, false); return 2; } @@ -281,8 +246,7 @@ static int Lpat_tostring(lua_State *L) static int Lpat_gc(lua_State *L) { pat_t *pat = lua_touserdata(L, 1); - if (pat) - recursively_free_pat(pat); + if (pat) delete_pat(&pat, true); return 0; } |
