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

ruby-changes:9727

From: akr <ko1@a...>
Date: Fri, 2 Jan 2009 15:02:17 +0900 (JST)
Subject: [ruby-changes:9727] Ruby:r21268 (trunk): * ext/socket/mkconstants.rb: use hash for family_to_str to avoid

akr	2009-01-02 15:01:57 +0900 (Fri, 02 Jan 2009)

  New Revision: 21268

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

  Log:
    * ext/socket/mkconstants.rb: use hash for family_to_str to avoid
      linear search.  lenp argument removed.
    * ext/socket/socket.c (ipaddr): call family_to_str without lenp
      argument.

  Modified files:
    trunk/ChangeLog
    trunk/ext/socket/mkconstants.rb
    trunk/ext/socket/socket.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 21267)
+++ ChangeLog	(revision 21268)
@@ -1,3 +1,11 @@
+Fri Jan  2 14:59:52 2009  Tanaka Akira  <akr@f...>
+
+	* ext/socket/mkconstants.rb: use hash for family_to_str to avoid
+	  linear search.  lenp argument removed.
+
+	* ext/socket/socket.c (ipaddr): call family_to_str without lenp
+	  argument.
+
 Fri Jan  2 14:33:12 2009  Tanaka Akira  <akr@f...>
 
 	* ext/socket/mkconstants.rb (gen_int_to_name): don't compare constants
Index: ext/socket/mkconstants.rb
===================================================================
--- ext/socket/mkconstants.rb	(revision 21267)
+++ ext/socket/mkconstants.rb	(revision 21268)
@@ -66,6 +66,13 @@
   }
 end
 
+def reverse_each_name(pat)
+  DEFS.reverse_each {|name, default_value|
+    next if pat !~ name
+    yield name
+  }
+end
+
 def each_names_with_len(pat)
   h = {}
   DEFS.each {|name, default_value|
@@ -95,27 +102,26 @@
     }
 EOS
 
-def each_alias(pat)
-  names = []
-  each_name(pat) {|n|
-    names << n
-  }
-  yield names
-end
-
-ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name(int_var, lenp_var, pat)")
-% each_name(pat) {|n|
+ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_hash(hash_var, pat)")
+    <%=hash_var%> = st_init_numtable();
+% reverse_each_name(pat) {|n|
 #ifdef <%=n%>
-    if (<%=int_var%> == <%=n%>) {
-        if (<%=lenp_var%>) *<%=lenp_var%> = <%=n.bytesize%>;
-        return <%=c_str n%>;
-    }
+    st_insert(<%=hash_var%>, (st_data_t)<%=n%>, (st_data_t)<%=c_str n%>);
 #endif
 % }
+EOS
+
+ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name(int_var, hash_var)")
+    st_data_t name;
+    if (st_lookup(<%=hash_var%>, (st_data_t)<%=int_var%>, &name))
+        return (char*)name;
     return NULL;
 EOS
 
 result << ERB.new(<<'EOS', nil, '%').result(binding)
+
+static st_table *family_to_str_hash;
+
 static void
 init_constants(VALUE mConst)
 {
@@ -133,8 +139,8 @@
 %   if guard
 #endif
 %   end
-
 % }
+<%= gen_int_to_name_hash('family_to_str_hash', /\AAF_/) %>
 }
 
 static int
@@ -186,9 +192,9 @@
 }
 
 static char *
-family_to_str(int val, int *lenp)
+family_to_str(int val)
 {
-<%= gen_int_to_name("val", "lenp", /\AAF_/) %>
+<%= gen_int_to_name("val", "family_to_str_hash") %>
 }
 
 EOS
Index: ext/socket/socket.c
===================================================================
--- ext/socket/socket.c	(revision 21267)
+++ ext/socket/socket.c	(revision 21268)
@@ -1063,7 +1063,7 @@
     char hbuf[1024], pbuf[1024];
     char *name;
 
-    name = family_to_str(sockaddr->sa_family, NULL);
+    name = family_to_str(sockaddr->sa_family);
     if (name)
         family = rb_str_new2(name);
     else {

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

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