diff options
author | ksaito <ksaito@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-11-29 15:16:20 +0000 |
---|---|---|
committer | ksaito <ksaito@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-11-29 15:16:20 +0000 |
commit | cb32ebe81c0d02a430d016cbdfd93960ec0b259d (patch) | |
tree | d13abbcf9eb745721935bca9eaf1102075093712 /regparse.c | |
parent | af7418e5c42ff7b399e644ce281a3d57b46740dc (diff) |
* regparse.c: now handles many alternatives (over 500000) in regexp. [ruby-dev:24773]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7418 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'regparse.c')
-rw-r--r-- | regparse.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/regparse.c b/regparse.c index f4b72c3e84..2d26786771 100644 --- a/regparse.c +++ b/regparse.c @@ -866,6 +866,7 @@ static FreeNode* FreeNodeList = (FreeNode* )NULL; extern void onig_node_free(Node* node) { + start: if (IS_NULL(node)) return ; switch (NTYPE(node)) { @@ -878,7 +879,23 @@ onig_node_free(Node* node) case N_LIST: case N_ALT: onig_node_free(NCONS(node).left); - onig_node_free(NCONS(node).right); + /* onig_node_free(NCONS(node).right); */ + { + Node* next_node = NCONS(node).right; + +#ifdef USE_RECYCLE_NODE + { + FreeNode* n = (FreeNode* )node; + n->next = FreeNodeList; + FreeNodeList = n; + } +#else + xfree(node); +#endif + + node = next_node; + goto start; + } break; case N_CCLASS: @@ -909,9 +926,7 @@ onig_node_free(Node* node) #ifdef USE_RECYCLE_NODE { - FreeNode* n; - - n = (FreeNode* )node; + FreeNode* n = (FreeNode* )node; n->next = FreeNodeList; FreeNodeList = n; } |