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/