[前][次][番号順一覧][スレッド一覧]

ruby-changes:6696

From: nobu <ko1@a...>
Date: Fri, 25 Jul 2008 19:45:58 +0900 (JST)
Subject: [ruby-changes:6696] Ruby:r18212 (ruby_1_8): * regex.c (xmalloc, xrealloc, xfree): not to use ruby managed memory.

nobu	2008-07-25 19:45:45 +0900 (Fri, 25 Jul 2008)

  New Revision: 18212

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=18212

  Log:
    * regex.c (xmalloc, xrealloc, xfree): not to use ruby managed memory.
    
    * regex.c (DOUBLE_STACK, re_compile_fastmap0, re_adjust_startpos),
      (re_search, re_match_exec): check if failed to allocate memory.

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/regex.c

Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 18211)
+++ ruby_1_8/ChangeLog	(revision 18212)
@@ -1,3 +1,10 @@
+Fri Jul 25 19:45:42 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* regex.c (xmalloc, xrealloc, xfree): not to use ruby managed memory.
+
+	* regex.c (DOUBLE_STACK, re_compile_fastmap0, re_adjust_startpos),
+	  (re_search, re_match_exec): check if failed to allocate memory.
+
 Fri Jul 25 18:04:17 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* bignum.c (rb_big2str0, bigsqr): made interruptible.  [ruby-Bugs-20622]
Index: ruby_1_8/regex.c
===================================================================
--- ruby_1_8/regex.c	(revision 18211)
+++ ruby_1_8/regex.c	(revision 18212)
@@ -50,6 +50,9 @@
 /* We need this for `regex.h', and perhaps for the Emacs include files.  */
 # include <sys/types.h>
 #endif
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
 
 #if !defined(__STDC__) && !defined(_MSC_VER)
 # define volatile
@@ -63,6 +66,10 @@
 
 #ifdef RUBY_PLATFORM
 #include "defines.h"
+#undef xmalloc
+#undef xrealloc
+#undef xcalloc
+#undef xfree
 
 # define RUBY
 extern int rb_prohibit_interrupt;
@@ -104,6 +111,11 @@
 # include <strings.h>
 #endif
 
+#define xmalloc     malloc
+#define xrealloc    realloc
+#define xcalloc     calloc
+#define xfree       free
+
 #ifdef C_ALLOCA
 #define FREE_VARIABLES() alloca(0)
 #else
@@ -127,10 +139,12 @@
   unsigned int xlen = stacke - stackb; 					\
   if (stackb == stacka) {						\
     stackx = (type*)xmalloc(2 * xlen * sizeof(type));			\
+    if (!stackx) goto memory_exhausted;					\
     memcpy(stackx, stackb, xlen * sizeof (type));			\
   }									\
   else {								\
     stackx = (type*)xrealloc(stackb, 2 * xlen * sizeof(type));		\
+    if (!stackx) goto memory_exhausted;					\
   }									\
   /* Rearrange the pointers. */						\
   stackp = stackx + (stackp - stackb);					\
@@ -2775,8 +2789,8 @@
    The caller must supply the address of a (1 << BYTEWIDTH)-byte data 
    area as bufp->fastmap.
    The other components of bufp describe the pattern to be used.  */
-void
-re_compile_fastmap(bufp)
+static int
+re_compile_fastmap0(bufp)
      struct re_pattern_buffer *bufp;
 {
   unsigned char *pattern = (unsigned char*)bufp->buffer;
@@ -2944,7 +2958,7 @@
 	    fastmap[j] = 1;
 	}
 	if (bufp->can_be_null) {
-	  FREE_AND_RETURN_VOID(stackb);
+	  FREE_AND_RETURN(stackb, 0);
 	}
 	/* Don't return; check the alternative paths
 	   so we can set can_be_null if appropriate.  */
@@ -3110,8 +3124,17 @@
     else
       break;
   }
-  FREE_AND_RETURN_VOID(stackb);
+  FREE_AND_RETURN(stackb, 0);
+ memory_exhausted:
+  FREE_AND_RETURN(stackb, -2);
 }
+
+void
+re_compile_fastmap(bufp)
+     struct re_pattern_buffer *bufp;
+{
+  (void)re_compile_fastmap0(bufp);
+}
 
 /* adjust startpos value to the position between characters. */
 int
@@ -3144,7 +3167,8 @@
 {
   /* Update the fastmap now if not correct already.  */
   if (!bufp->fastmap_accurate) {
-    re_compile_fastmap(bufp);
+    int ret = re_compile_fastmap0(bufp);
+    if (ret) return ret;
   }
 
   /* Adjust startpos for mbc string */
@@ -3190,7 +3214,8 @@
 
   /* Update the fastmap now if not correct already.  */
   if (fastmap && !bufp->fastmap_accurate) {
-    re_compile_fastmap(bufp);
+    int ret = re_compile_fastmap0(bufp);
+    if (ret) return ret;
   }
 
 
@@ -3580,7 +3605,7 @@
      ``dummy''; if a failure happens and the failure point is a dummy, it
      gets discarded and the next next one is tried.  */
 
-  unsigned char **stacka;
+  unsigned char **const stacka = 0;
   unsigned char **stackb;
   unsigned char **stackp;
   unsigned char **stacke;
@@ -3629,8 +3654,7 @@
   }
 
   /* Initialize the stack. */
-  stacka = RE_TALLOC(MAX_NUM_FAILURE_ITEMS * NFAILURES, unsigned char*);
-  stackb = stacka;
+  stackb = TMALLOC(MAX_NUM_FAILURE_ITEMS * NFAILURES, unsigned char*);
   stackp = stackb;
   stacke = &stackb[MAX_NUM_FAILURE_ITEMS * NFAILURES];
 
@@ -4400,6 +4424,8 @@
     goto restore_best_regs;
 
   FREE_AND_RETURN(stackb,(-1)); 	/* Failure to match.  */
+ memory_exhausted:
+  FREE_AND_RETURN(stackb,(-2));
 }
 
 
@@ -4663,5 +4689,5 @@
   mode		 : C
   c-file-style	 : "gnu"
   tab-width	 : 8
-  End		 :
+  End
 */

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]