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

ruby-changes:6827

From: shyouhei <ko1@a...>
Date: Mon, 4 Aug 2008 14:12:01 +0900 (JST)
Subject: [ruby-changes:6827] Ruby:r18343 (ruby_1_8_6): merge revision(s) 18212:

shyouhei	2008-08-04 14:11:52 +0900 (Mon, 04 Aug 2008)

  New Revision: 18343

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

  Log:
    merge revision(s) 18212:
    * 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_6/ChangeLog
    branches/ruby_1_8_6/regex.c
    branches/ruby_1_8_6/version.h

Index: ruby_1_8_6/ChangeLog
===================================================================
--- ruby_1_8_6/ChangeLog	(revision 18342)
+++ ruby_1_8_6/ChangeLog	(revision 18343)
@@ -1,3 +1,10 @@
+Mon Aug  4 14:10:01 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.
+
 Mon Aug  4 13:49:36 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* bignum.c (rb_big2str0, bigsqr): made interruptible.  [ruby-Bugs-20622]
Index: ruby_1_8_6/version.h
===================================================================
--- ruby_1_8_6/version.h	(revision 18342)
+++ ruby_1_8_6/version.h	(revision 18343)
@@ -2,7 +2,7 @@
 #define RUBY_RELEASE_DATE "2008-08-04"
 #define RUBY_VERSION_CODE 186
 #define RUBY_RELEASE_CODE 20080804
-#define RUBY_PATCHLEVEL 283
+#define RUBY_PATCHLEVEL 284
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
Index: ruby_1_8_6/regex.c
===================================================================
--- ruby_1_8_6/regex.c	(revision 18342)
+++ ruby_1_8_6/regex.c	(revision 18343)
@@ -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);					\
@@ -2769,8 +2783,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;
@@ -2938,7 +2952,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.  */
@@ -3104,8 +3118,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
@@ -3138,7 +3161,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 */
@@ -3184,7 +3208,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;
   }
 
 
@@ -3574,7 +3599,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;
@@ -3623,8 +3648,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];
 
@@ -4394,6 +4418,8 @@
     goto restore_best_regs;
 
   FREE_AND_RETURN(stackb,(-1)); 	/* Failure to match.  */
+ memory_exhausted:
+  FREE_AND_RETURN(stackb,(-2));
 }
 
 
@@ -4657,5 +4683,5 @@
   mode		 : C
   c-file-style	 : "gnu"
   tab-width	 : 8
-  End		 :
+  End
 */

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

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