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

ruby-changes:3939

From: ko1@a...
Date: Mon, 11 Feb 2008 16:52:29 +0900 (JST)
Subject: [ruby-changes:3939] shyouhei - Ruby:r15429 (ruby_1_8): * gc.c (rb_newobj): prohibit call of rb_newobj() during gc.

shyouhei	2008-02-11 16:52:13 +0900 (Mon, 11 Feb 2008)

  New Revision: 15429

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/ext/dl/ptr.c
    branches/ruby_1_8/gc.c
    branches/ruby_1_8/version.h

  Log:
    * gc.c (rb_newobj): prohibit call of rb_newobj() during gc.
      Submitted by Sylvain Joyeux [ruby-core:12099].
    
    * ext/dl/ptr.c: do not use LONG2NUM() inside dlptr_free().
      Slightly modified fix bassed on a patch by Sylvain Joyeux
      [ruby-core:12099] [ ruby-bugs-11859 ] [ ruby-bugs-11882 ]
      [ ruby-patches-13151 ].


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=15429&r2=15428&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/version.h?r1=15429&r2=15428&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/gc.c?r1=15429&r2=15428&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ext/dl/ptr.c?r1=15429&r2=15428&diff_format=u

Index: ruby_1_8/ext/dl/ptr.c
===================================================================
--- ruby_1_8/ext/dl/ptr.c	(revision 15428)
+++ ruby_1_8/ext/dl/ptr.c	(revision 15429)
@@ -4,30 +4,22 @@
 
 #include <ruby.h>
 #include <ctype.h>
-#include <version.h> /* for ruby version code */
+#include "st.h"
 #include "dl.h"
 
 VALUE rb_cDLPtrData;
 VALUE rb_mDLMemorySpace;
-static VALUE DLMemoryTable;
+static st_table* st_memory_table;
 
 #ifndef T_SYMBOL
 # define T_SYMBOL T_FIXNUM
 #endif
 
-#if RUBY_VERSION_CODE < 171
-static VALUE
-rb_hash_delete(VALUE hash, VALUE key)
-{
-  return rb_funcall(hash, rb_intern("delete"), 1, key);
-}
-#endif
-
 static void
 rb_dlmem_delete(void *ptr)
 {
   rb_secure(4);
-  rb_hash_delete(DLMemoryTable, DLLONG2NUM(ptr));
+  st_delete(st_memory_table, (st_data_t*)&ptr, NULL);
 }
 
 static void
@@ -37,7 +29,7 @@
     rb_dlmem_delete(ptr);
   }
   else{
-    rb_hash_aset(DLMemoryTable, DLLONG2NUM(ptr), DLLONG2NUM(obj));
+    st_insert(st_memory_table, (st_data_t)ptr, (st_data_t)obj);
   }
 }
 
@@ -46,8 +38,8 @@
 {
   VALUE val;
 
-  val = rb_hash_aref(DLMemoryTable, DLLONG2NUM(ptr));
-  return val == Qnil ? Qnil : (VALUE)DLNUM2LONG(val);
+  if(!st_lookup(st_memory_table, (st_data_t)ptr, &val)) return Qnil;
+  return val == Qundef ? Qnil : val;
 }
 
 void
@@ -1010,20 +1002,18 @@
   }
 }
 
-static VALUE
-dlmem_each_i(VALUE assoc, void *data)
+static int
+dlmem_each_i(void* key, VALUE value, void* arg)
 {
-  VALUE key, val;
-  key = rb_ary_entry(assoc, 0);
-  val = rb_ary_entry(assoc, 1);
-  rb_yield(rb_assoc_new(key,(VALUE)DLNUM2LONG(val)));
+  VALUE vkey = DLLONG2NUM(key);
+  rb_yield(rb_assic_new(vkey, value));
   return Qnil;
 }
 
 VALUE
 rb_dlmem_each(VALUE self)
 {
-  rb_iterate(rb_each, DLMemoryTable, dlmem_each_i, 0);
+  st_foreach(st_memory_table, dlmem_each_i, 0);
   return Qnil;
 }
 
@@ -1062,7 +1052,7 @@
   rb_define_method(rb_cDLPtrData, "size=", rb_dlptr_size, -1);
 
   rb_mDLMemorySpace = rb_define_module_under(rb_mDL, "MemorySpace");
-  DLMemoryTable = rb_hash_new();
-  rb_define_const(rb_mDLMemorySpace, "MemoryTable", DLMemoryTable);
+  st_memory_table = st_init_numtable();
+  rb_define_const(rb_mDLMemorySpace, "MemoryTable", Qnil); /* historical */
   rb_define_module_function(rb_mDLMemorySpace, "each", rb_dlmem_each, 0);
 }
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 15428)
+++ ruby_1_8/ChangeLog	(revision 15429)
@@ -1,3 +1,13 @@
+Mon Feb 11 16:31:47 2008  URABE Shyouhei  <shyouhei@i...>
+
+	* gc.c (rb_newobj): prohibit call of rb_newobj() during gc.
+	  Submitted by Sylvain Joyeux [ruby-core:12099].
+
+	* ext/dl/ptr.c: do not use LONG2NUM() inside dlptr_free().
+	  Slightly modified fix bassed on a patch by Sylvain Joyeux
+	  [ruby-core:12099] [ ruby-bugs-11859 ] [ ruby-bugs-11882 ]
+	  [ ruby-patches-13151 ].
+
 Mon Feb 11 00:22:55 2008  NARUSE, Yui  <naruse@r...>
 
 	* lib/benchmark.rb (Job::Benchmark#item): fix typo.
Index: ruby_1_8/version.h
===================================================================
--- ruby_1_8/version.h	(revision 15428)
+++ ruby_1_8/version.h	(revision 15429)
@@ -1,5 +1,5 @@
 #define RUBY_VERSION "1.8.6"
-#define RUBY_RELEASE_DATE "2008-02-09"
+#define RUBY_RELEASE_DATE "2008-02-11"
 #define RUBY_VERSION_CODE 186
 #define RUBY_RELEASE_CODE 20080209
 #define RUBY_PATCHLEVEL 5000
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 6
 #define RUBY_RELEASE_YEAR 2008
 #define RUBY_RELEASE_MONTH 2
-#define RUBY_RELEASE_DAY 9
+#define RUBY_RELEASE_DAY 11
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
Index: ruby_1_8/gc.c
===================================================================
--- ruby_1_8/gc.c	(revision 15428)
+++ ruby_1_8/gc.c	(revision 15429)
@@ -378,6 +378,9 @@
 {
     VALUE obj;
 
+    if (during_gc)
+	rb_bug("object allocation during garbage collection phase");
+
     if (!freelist) garbage_collect();
 
     obj = (VALUE)freelist;

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

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