[#25808] break & retry in block — Shin-ichiro HARA <sinara@...>

原です。

15 messages 2005/03/04

[#25812] Re: [ruby-cvs] ruby/test/ruby, ruby/test/logger, ruby/sample, ruby/misc, ruby/lib/xmlrpc, ruby/lib/wsdl/soap, ruby/lib/rexml, ruby/lib/rdoc/parsers, ruby/lib/rdoc/generators, ruby/lib/irb, ruby/lib, ruby/ext/zlib, ruby/ext/win32ole, ruby/ext/tk, ruby/ext/strscan, ruby/ext/socket, ruby/ext/readline, ruby/ext/pty, ruby/ext/openssl, ruby/ext/iconv, ruby/ext/etc, ruby/ext/dl, ruby/ext/curses, ruby/ext/bigdecimal, ruby/ext/Win32API, ruby: * array.c: replace rb_protect_inspect() and rb_inspecting_p() by — Tanaka Akira <akr@...17n.org>

In article <20050304064753.53859C671F@lithium.ruby-lang.org>,

3 messages 2005/03/06

[#25853] conflict method and local variable — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

56 messages 2005/03/10
[#25854] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/10

まつもと ゆきひろです

[#25855] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/10

永井@知能.九工大です.

[#25856] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/10

まつもと ゆきひろです

[#25857] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/11

永井@知能.九工大です.

[#25858] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/11

まつもと ゆきひろです

[#25861] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/11

永井@知能.九工大です.

[#25863] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/11

まつもと ゆきひろです

[#25864] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/11

永井@知能.九工大です.

[#25865] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/11

まつもと ゆきひろです

[#25866] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/11

永井@知能.九工大です.

[#25869] Re: conflict method and local variable — Shugo Maeda <shugo@...> 2005/03/13

前田です。

[#25875] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/13

まつもと ゆきひろです

[#25878] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/13

永井@知能.九工大です.

[#25882] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/13

まつもと ゆきひろです

[#25884] Re: conflict method and local variable — Hidetoshi NAGAI <nagai@...> 2005/03/14

永井@知能.九工大です.

[#25885] Re: conflict method and local variable — Yukihiro Matsumoto <matz@...> 2005/03/14

まつもと ゆきひろです

[#25888] Re: conflict method and local variable — Shugo Maeda <shugo@...> 2005/03/14

前田です。

[#25946] ext/tk/sample/**/*.gif are broken — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

16 messages 2005/03/27

[#25959] some trouble on ext/tk/sample — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

20 messages 2005/03/29
[#25969] Re: some trouble on ext/tk/sample — Hidetoshi NAGAI <nagai@...> 2005/03/30

永井@知能.九工大です.

[#25970] Re: some trouble on ext/tk/sample — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/03/30

山本です。

[#25973] Re: some trouble on ext/tk/sample — Hidetoshi NAGAI <nagai@...> 2005/03/31

永井@知能.九工大です.

[ruby-dev:25783] Re: 鬼車コードレビュー

From: Yukihiro Matsumoto <matz@...>
Date: 2005-03-01 23:50:20 UTC
List: ruby-dev #25783
まつもと ゆきひろです

In message "Re: [ruby-dev:25779] Re: 鬼車コードレビュー"
    on Tue, 1 Mar 2005 21:03:10 +0900, "K.Kosako" <sndgk393@ybb.ne.jp> writes:

|>   (2) regparse.c:name_add()で登録されたNameEntryがどこでも
|>       freeされていないように思える。e->name, e->back_refsは
|>       i_free_name_entry()でfreeされているようだ。
|> 
|> で、それはそれとしてst_*_strendはregparse.cに(renameして)移
|> 動したいのですが構いませんか?
|
|どうぞ。
|(2)のバグは、そちらの作業が終わった後に
|修正します。

ありがとうございます。以下のような修正を行いました。

  * _strend関連をst.[ch]からregparse.cへ移動
  * st_insert()にメモリリークがあったので修正(キーがすでに登
    録されていた時st_strend_keyがリーク)
  * 実際に使われていない関数は削除
  * st.[ch]からfree_key, clone_keyを削除
  * free_keyが呼ばれていたタイミングで明示的にkeyを削除

他の修正と混じっているので、すぐにコミットできませんが、近い
うちにコミットします。パッチを添付します。(2)のバグも一緒に
直したと思いますので、よかったらチェックしてみてください。

|strend関連の移動の他には、st.[ch]の変更は
|ないのでしょうか?

上記のようにfree_key, clone_keyがなくなりました。

Index: st.c
===================================================================
RCS file: /var/cvs/src/ruby/st.c,v
retrieving revision 1.33
diff -p -u -1 -r1.33 st.c
--- st.c	23 Feb 2005 13:10:45 -0000	1.33
+++ st.c	1 Mar 2005 23:44:32 -0000
@@ -58,4 +58,2 @@ static struct st_hash_type type_numhash 
     numhash,
-    st_nothing_key_free,
-    st_nothing_key_clone
 };
@@ -67,16 +65,2 @@ static struct st_hash_type type_strhash 
     strhash,
-    st_nothing_key_free,
-    st_nothing_key_clone
-};
-
-static int strend_cmp(st_strend_key*, st_strend_key*);
-static int strend_hash(st_strend_key*);
-static int strend_key_free(st_data_t key);
-static st_data_t strend_key_clone(st_data_t x);
-
-static struct st_hash_type type_strend_hash = {
-    strend_cmp,
-    strend_hash,
-    strend_key_free,
-    strend_key_clone
 };
@@ -230,9 +214,2 @@ st_init_strtable_with_size(size)
 
-st_table*
-st_init_strend_table_with_size(size)
-    int size;
-{
-    return st_init_table_with_size(&type_strend_hash, size);
-}
-
 void
@@ -248,3 +225,2 @@ st_free_table(table)
 	    next = ptr->next;
-            table->type->key_free(ptr->key);
 	    free(ptr);
@@ -299,17 +275,2 @@ st_lookup(table, key, value)
 
-int
-st_lookup_strend(table, str_key, end_key, value)
-    st_table *table;
-    const unsigned char* str_key;
-    const unsigned char* end_key;
-    st_data_t *value;
-{
-  st_strend_key key;
-
-  key.s   = (unsigned char* )str_key;
-  key.end = (unsigned char* )end_key;
-
-  return st_lookup(table, (st_data_t )(&key), value);
-}
-
 #define ADD_DIRECT(table, key, value, hash_val, bin_pos)\
@@ -354,18 +315,2 @@ st_insert(table, key, value)
 
-int
-st_insert_strend(table, str_key, end_key, value)
-     st_table *table;
-     const unsigned char* str_key;
-     const unsigned char* end_key;
-     st_data_t value;
-{
-  st_strend_key* key;
-
-  key = alloc(st_strend_key);
-  key->s   = (unsigned char* )str_key;
-  key->end = (unsigned char* )end_key;
-
-  return st_insert(table, (st_data_t )key, value);
-}
-
 void
@@ -383,17 +328,2 @@ st_add_direct(table, key, value)
 
-void
-st_add_direct_strend(table, str_key, end_key, value)
-    st_table *table;
-    const unsigned char* str_key;
-    const unsigned char* end_key;
-    st_data_t value;
-{
-  st_strend_key* key;
-
-  key = alloc(st_strend_key);
-  key->s   = (unsigned char* )str_key;
-  key->end = (unsigned char* )end_key;
-  st_add_direct(table, (st_data_t )key, value);
-}
-
 static void
@@ -457,3 +387,2 @@ st_copy(old_table)
 	    *entry = *ptr;
-            entry->key  = old_table->type->key_clone(ptr->key);
 	    entry->next = new_table->bins[i];
@@ -558,3 +487,3 @@ st_cleanup_safe(table, never)
 
-void
+int
 st_foreach(table, func, arg)
@@ -571,3 +500,3 @@ st_foreach(table, func, arg)
 	for(ptr = table->bins[i]; ptr != 0;) {
-	    retval = (*func)(ptr->key, ptr->record, arg, 0);
+	    retval = (*func)(ptr->key, ptr->record, arg);
 	    switch (retval) {
@@ -582,4 +511,3 @@ st_foreach(table, func, arg)
 		    /* call func with error notice */
-		    retval = (*func)(0, 0, arg, 1);
-		    return;
+		    return 1;
 		}
@@ -591,3 +519,3 @@ st_foreach(table, func, arg)
 	    case ST_STOP:
-		return;
+	        return 0;
 	    case ST_DELETE:
@@ -601,3 +529,2 @@ st_foreach(table, func, arg)
 		ptr = ptr->next;
-                table->type->key_free(tmp->key);
 		free(tmp);
@@ -607,2 +534,3 @@ st_foreach(table, func, arg)
     }
+    return 0;
 }
@@ -660,58 +588,2 @@ numhash(n)
     return n;
-}
-
-extern int
-st_nothing_key_free(st_data_t key) { return 0; }
-
-extern st_data_t
-st_nothing_key_clone(st_data_t x) { return x; } 
-
-static int strend_cmp(st_strend_key* x, st_strend_key* y)
-{
-  unsigned char *p, *q;
-  int c;
-
-  if ((x->end - x->s) != (y->end - y->s))
-    return 1;
-
-  p = x->s;
-  q = y->s;
-  while (p < x->end) {
-    c = (int )*p - (int )*q;
-    if (c != 0) return c;
-
-    p++; q++;
-  }
-
-  return 0;
-}
-
-static int strend_hash(st_strend_key* x)
-{
-  int val;
-  unsigned char *p;
-
-  val = 0;
-  p = x->s;
-  while (p < x->end) {
-    val = val * 997 + (int )*p++;
-  }
-
-  return val + (val >> 5);
-}
-
-static int strend_key_free(st_data_t x)
-{
-  xfree((void* )x);
-  return 0;
-}
-
-static st_data_t strend_key_clone(st_data_t x)
-{
-  st_strend_key* new_key;
-  st_strend_key* key = (st_strend_key* )x;
-
-  new_key = alloc(st_strend_key);
-  *new_key = *key;
-  return (st_data_t )new_key;
 }
Index: st.h
===================================================================
RCS file: /var/cvs/src/ruby/st.h,v
retrieving revision 1.13
diff -p -u -1 -r1.13 st.h
--- st.h	23 Feb 2005 13:10:45 -0000	1.13
+++ st.h	1 Mar 2005 23:44:32 -0000
@@ -16,4 +16,2 @@ struct st_hash_type {
     int (*hash)();
-    int (*key_free)();
-    st_data_t (*key_clone)();
 };
@@ -27,7 +25,2 @@ struct st_table {
 
-typedef struct {
-  unsigned char* s;
-  unsigned char* end;
-} st_strend_key;
-
 #define st_is_member(table,key) st_lookup(table,key,(st_data_t *)0)
@@ -53,3 +46,2 @@ st_table *st_init_strtable _((void));
 st_table *st_init_strtable_with_size _((int));
-st_table *st_init_strend_table_with_size _((int));
 int st_delete _((st_table *, st_data_t *, st_data_t *));
@@ -57,8 +49,5 @@ int st_delete_safe _((st_table *, st_dat
 int st_insert _((st_table *, st_data_t, st_data_t));
-int st_insert_strend _((st_table *, const unsigned char*, const unsigned char*, st_data_t));
 int st_lookup _((st_table *, st_data_t, st_data_t *));
-int st_lookup_strend _((st_table *, const unsigned char*, const unsigned char*, st_data_t*));
-void st_foreach _((st_table *, int (*)(ANYARGS), st_data_t));
+int st_foreach _((st_table *, int (*)(ANYARGS), st_data_t));
 void st_add_direct _((st_table *, st_data_t, st_data_t));
-void st_add_direct_strend _((st_table *, const unsigned char*, const unsigned char*, st_data_t));
 void st_free_table _((st_table *));
@@ -66,5 +55,2 @@ void st_cleanup_safe _((st_table *, st_d
 st_table *st_copy _((st_table *));
-
-extern st_data_t st_nothing_key_clone _((st_data_t key));
-extern int st_nothing_key_free _((st_data_t key));
 
Index: regparse.c
===================================================================
RCS file: /var/cvs/src/ruby/regparse.c,v
retrieving revision 1.15
diff -p -u -1 -r1.15 regparse.c
--- regparse.c	23 Feb 2005 12:47:23 -0000	1.15
+++ regparse.c	1 Mar 2005 23:44:33 -0000
@@ -307,2 +307,84 @@ typedef struct {
 
+typedef struct {
+  unsigned char* s;
+  unsigned char* end;
+} st_strend_key;
+
+static int strend_cmp(st_strend_key*, st_strend_key*);
+static int strend_hash(st_strend_key*);
+
+static struct st_hash_type type_strend_hash = {
+  strend_cmp,
+  strend_hash,
+};
+
+static st_table*
+onig_st_init_strend_table_with_size(int size)
+{
+    return onig_st_init_table_with_size(&type_strend_hash, size);
+}
+
+static int
+onig_st_lookup_strend(st_table *table, const UChar* str_key, const UChar* end_key, st_data_t *value)
+{
+    st_strend_key key;
+
+    key.s   = (unsigned char* )str_key;
+    key.end = (unsigned char* )end_key;
+
+    return onig_st_lookup(table, (st_data_t )(&key), value);
+}
+
+static int
+onig_st_insert_strend(st_table *table, const UChar* str_key, const UChar* end_key, st_data_t value)
+{
+  st_strend_key* key;
+  int result;
+
+  key = (st_strend_key* )xmalloc(sizeof(st_strend_key));
+  key->s   = (unsigned char* )str_key;
+  key->end = (unsigned char* )end_key;
+  result = onig_st_insert(table, (st_data_t )key, value);
+  if (result) {
+    xfree(key);
+  }
+  return result;
+}
+
+static int
+strend_cmp(st_strend_key* x, st_strend_key* y)
+{
+  unsigned char *p, *q;
+  int c;
+
+  if ((x->end - x->s) != (y->end - y->s))
+    return 1;
+
+  p = x->s;
+  q = y->s;
+  while (p < x->end) {
+    c = (int )*p - (int )*q;
+    if (c != 0) return c;
+
+    p++; q++;
+  }
+
+  return 0;
+}
+
+static int
+strend_hash(st_strend_key* x)
+{
+  int val;
+  unsigned char *p;
+
+  val = 0;
+  p = x->s;
+  while (p < x->end) {
+    val = val * 997 + (int )*p++;
+  }
+
+  return val + (val >> 5);
+}
+
 typedef st_table  NameTable;
@@ -352,4 +434,6 @@ i_free_name_entry(UChar* key, NameEntry*
 {
-  xfree(e->name);  /* == key */
+  xfree(e->name);
   if (IS_NOT_NULL(e->back_refs)) xfree(e->back_refs);
+  xfree(key);
+  xfree(e);
   return ST_DELETE;
@@ -4548,18 +4632,2 @@ static int type_cclass_hash(type_cclass_
 
-static int type_cclass_key_free(st_data_t x)
-{
-  xfree((void* )x);
-  return 0;
-}
-
-static st_data_t type_cclass_key_clone(st_data_t x)
-{
-  type_cclass_key* new_key;
-  type_cclass_key* key = (type_cclass_key* )x;
-
-  new_key = (type_cclass_key* )xmalloc(sizeof(type_cclass_key));
-  *new_key = *key;
-  return (st_data_t )new_key;
-}
-
 static struct st_hash_type type_type_cclass_hash = {
@@ -4567,4 +4635,2 @@ static struct st_hash_type type_type_ccl
     type_cclass_hash,
-    type_cclass_key_free,
-    type_cclass_key_clone
 };
Index: hash.c
===================================================================
RCS file: /var/cvs/src/ruby/hash.c,v
retrieving revision 1.146
diff -p -u -1 -r1.146 hash.c
--- hash.c	28 Jan 2005 15:21:48 -0000	1.146
+++ hash.c	1 Mar 2005 23:44:33 -0000
@@ -104,4 +104,2 @@ static struct st_hash_type objhash = {
     rb_any_hash,
-    st_nothing_key_free,
-    st_nothing_key_clone
 };
@@ -115,3 +113,3 @@ struct foreach_safe_arg {
 static int
-foreach_safe_i(key, value, arg, err)
+foreach_safe_i(key, value, arg)
     st_data_t key, value;
@@ -121,7 +119,4 @@ foreach_safe_i(key, value, arg, err)
 
-    if (err) {
-	rb_raise(rb_eRuntimeError, "hash modified during iteration");
-    }
     if (key == Qundef) return ST_CONTINUE;
-    status = (*arg->func)(key, value, arg->arg, err);
+    status = (*arg->func)(key, value, arg->arg);
     if (status == ST_CONTINUE) {
@@ -143,3 +138,5 @@ st_foreach_safe(table, func, a)
     arg.arg = a;
-    st_foreach(table, foreach_safe_i, (st_data_t)&arg);
+    if (st_foreach(table, foreach_safe_i, (st_data_t)&arg)) {
+	rb_raise(rb_eRuntimeError, "hash modified during iteration");
+    }
 }
@@ -153,6 +150,5 @@ struct hash_foreach_arg {
 static int
-hash_foreach_iter(key, value, arg, err)
+hash_foreach_iter(key, value, arg)
     VALUE key, value;
     struct hash_foreach_arg *arg;
-    int err;
 {
@@ -161,5 +157,2 @@ hash_foreach_iter(key, value, arg, err)
 
-    if (err) {
-	rb_raise(rb_eRuntimeError, "hash modified during iteration");
-    }
     tbl = RHASH(arg->hash)->tbl;
@@ -201,3 +194,5 @@ hash_foreach_call(arg)
 {
-    st_foreach(RHASH(arg->hash)->tbl, hash_foreach_iter, (st_data_t)arg);
+    if (st_foreach(RHASH(arg->hash)->tbl, hash_foreach_iter, (st_data_t)arg)) {
+ 	rb_raise(rb_eRuntimeError, "hash modified during iteration");
+    }
     return Qnil;

In This Thread

Prev Next