[#28015] RCR: RUBY_VERSION_INT — Roger Pack <rogerdpack2@...>

Situation:

14 messages 2010/02/02

[#28113] [Bug #2723] $: length affects re-require time of already loaded files — Greg Hazel <redmine@...>

Bug #2723: $: length affects re-require time of already loaded files

16 messages 2010/02/08

[#28151] [Bug #2739] ruby 1.8.7 built with pthreads hangs under some circumstances — Joel Ebel <redmine@...>

Bug #2739: ruby 1.8.7 built with pthreads hangs under some circumstances

31 messages 2010/02/11

[#28188] [Bug #2750] build fails on win32/MinGW: "executable host ruby is required." even when --with-baseruby is used — Christian Bodt <redmine@...>

Bug #2750: build fails on win32/MinGW: "executable host ruby is required." even when --with-baseruby is used

9 messages 2010/02/16

[#28206] Is Math module a wrapper of libm? — Yusuke ENDOH <mame@...>

Hi matz --

23 messages 2010/02/18
[#28212] Re: Is Math module a wrapper of libm? — Yukihiro Matsumoto <matz@...> 2010/02/18

Hi,

[#28219] Re: Is Math module a wrapper of libm? — Yusuke ENDOH <mame@...> 2010/02/18

Hi,

[#28225] Re: Is Math module a wrapper of libm? — Marc-Andre Lafortune <ruby-core-mailing-list@...> 2010/02/18

Hi,

[#28233] Re: Is Math module a wrapper of libm? — Kenta Murata <muraken@...> 2010/02/18

Hi,

[#28265] Re: Is Math module a wrapper of libm? — Marc-Andre Lafortune <ruby-core-mailing-list@...> 2010/02/20

Hi,

[#28286] Re: Is Math module a wrapper of libm? — Kenta Murata <muraken@...> 2010/02/21

Hi

[#28291] Re: Is Math module a wrapper of libm? — Marc-Andre Lafortune <ruby-core-mailing-list@...> 2010/02/22

Hi!

[#28235] [Feature #2759] Regexp /g and /G options — Michael Fellinger <redmine@...>

Feature #2759: Regexp /g and /G options

35 messages 2010/02/18
[#28459] [Feature #2759] Regexp /g and /G options — caleb clausen <redmine@...> 2010/03/04

Issue #2759 has been updated by caleb clausen.

[#28329] [ANN] Ruby 1.9.2dev has passed RubySpec! — Yusuke ENDOH <mame@...>

Hi,

12 messages 2010/02/24

[#28355] [ANN] Toward rich diversity of Ruby development. — Urabe Shyouhei <shyouhei@...>

A short announcement: thanks to some helps of GitHub people, I now have

12 messages 2010/02/27

[#28365] Indentifying key MRI-on-Windows issues — Jon <jon.forums@...>

In an effort to begin summarizing key MRI-on-Windows open issues I'm starting this thread in hopes that those interested will respond with details on the key MRI issues they feel need resolution for Windows users.

11 messages 2010/02/27
[#28690] Re: Indentifying key MRI-on-Windows issues — Roger Pack <rogerdpack2@...> 2010/03/16

> My key concern is http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/24968

[ruby-core:28111] Re: [Bug #2644] memory over-allocation with regexp

From: Yusuke ENDOH <mame@...>
Date: 2010-02-08 14:48:03 UTC
List: ruby-core #28111
Hi,

2010/2/8 Greg Hazel <redmine@ruby-lang.org>:
> So, I think it should be fixed.

I agree.  Could you please give us a patch? :-P


I guess the last .* node can be optimized by translating into (?>.*),
but I'm not at all sure that this patch has no bug.  Do anyone review
this?

diff --git a/regcomp.c b/regcomp.c
index e1ac7ee..16c816b 100644
--- a/regcomp.c
+++ b/regcomp.c
@@ -3643,6 +3643,7 @@ setup_comb_exp_check(Node* node, int state, ScanEnv* env)
 #define IN_NOT        (1<<1)
 #define IN_REPEAT     (1<<2)
 #define IN_VAR_REPEAT (1<<3)
+#define IN_LAST	      (1<<4)

 /* setup_tree does the following work.
  1. check empty loop. (set qn->target_empty_info)
@@ -3664,7 +3665,8 @@ setup_tree(Node* node, regex_t* reg, int state,
ScanEnv* env)
     {
       Node* prev = NULL_NODE;
       do {
-	r = setup_tree(NCAR(node), reg, state, env);
+	int s = IS_NOT_NULL(NCDR(node)) ? (state & ~IN_LAST) : state;
+	r = setup_tree(NCAR(node), reg, s, env);
 	if (IS_NOT_NULL(prev) && r == 0) {
 	  r = next_setup(prev, NCAR(node), reg);
 	}
@@ -3795,6 +3797,20 @@ setup_tree(Node* node, regex_t* reg, int state,
ScanEnv* env)
 	}
       }
 #endif
+
+      if ((state & IN_LAST) != 0 && qn->greedy &&
IS_REPEAT_INFINITE(qn->upper)) {
+	/* automatic posseivation a* (at last) ==> (?>a*) */
+	if (qn->lower <= 1) {
+	  int ttype = NTYPE(qn->target);
+	  if (IS_NODE_TYPE_SIMPLE(ttype)) {
+	    Node* en = onig_node_new_enclose(ENCLOSE_STOP_BACKTRACK);
+	    CHECK_NULL_RETURN_MEMERR(en);
+	    SET_ENCLOSE_STATUS(en, NST_STOP_BT_SIMPLE_REPEAT);
+	    swap_node(node, en);
+	    NENCLOSE(node)->target = en;
+	  }
+	}
+      }
     }
     break;

@@ -5423,7 +5439,7 @@ onig_compile(regex_t* reg, const UChar* pattern,
const UChar* pattern_end,
     reg->num_call = 0;
 #endif

-  r = setup_tree(root, reg, 0, &scan_env);
+  r = setup_tree(root, reg, IN_LAST, &scan_env);
   if (r != 0) goto err_unset;

 #ifdef ONIG_DEBUG_PARSE_TREE

-- 
Yusuke ENDOH <mame@tsg.ne.jp>

In This Thread