aboutsummaryrefslogtreecommitdiffstats
path: root/regparse.c
diff options
context:
space:
mode:
authorksaito <ksaito@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-11-29 15:16:20 +0000
committerksaito <ksaito@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-11-29 15:16:20 +0000
commitcb32ebe81c0d02a430d016cbdfd93960ec0b259d (patch)
treed13abbcf9eb745721935bca9eaf1102075093712 /regparse.c
parentaf7418e5c42ff7b399e644ce281a3d57b46740dc (diff)
downloadruby-cb32ebe81c0d02a430d016cbdfd93960ec0b259d.tar.gz
* 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.c23
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;
}