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

ruby-changes:28217

From: nobu <ko1@a...>
Date: Sat, 13 Apr 2013 10:20:43 +0900 (JST)
Subject: [ruby-changes:28217] nobu:r40269 (trunk): struct.c: split make_struct

nobu	2013-04-13 10:20:34 +0900 (Sat, 13 Apr 2013)

  New Revision: 40269

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

  Log:
    struct.c: split make_struct
    
    * struct.c (anonymous_struct, new_struct, setup_struct): split
      make_struct() for each purpose.

  Modified files:
    trunk/ChangeLog
    trunk/struct.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 40268)
+++ ChangeLog	(revision 40269)
@@ -1,231 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
-Sat Apr 13 09:34:31 2013  Tanaka Akira  <akr@f...>
+Sat Apr 13 10:20:32 2013  Nobuyoshi Nakada  <nobu@r...>
 
-	* lib/mkmf.rb: Add ruby/ruby.h, ruby/missing.h, ruby/intern.h,
-	  ruby/st.h and ruby/subst.h for ruby_headers in generated Makefile.
+	* struct.c (anonymous_struct, new_struct, setup_struct): split
+	  make_struct() for each purpose.
 
-	* ext/-test-/old_thread_select/depend: Update dependencies.
-
-	* ext/-test-/wait_for_single_fd/depend: Ditto.
-
-	* ext/bigdecimal/depend: Ditto.
-
-	* ext/curses/depend: Ditto.
-
-	* ext/digest/bubblebabble/depend: Ditto.
-
-	* ext/digest/depend: Ditto.
-
-	* ext/digest/md5/depend: Ditto.
-
-	* ext/digest/rmd160/depend: Ditto.
-
-	* ext/digest/sha1/depend: Ditto.
-
-	* ext/digest/sha2/depend: Ditto.
-
-	* ext/dl/callback/depend: Ditto.
-
-	* ext/dl/depend: Ditto.
-
-	* ext/etc/depend: Ditto.
-
-	* ext/nkf/depend: Ditto.
-
-	* ext/objspace/depend: Ditto.
-
-	* ext/pty/depend: Ditto.
-
-	* ext/readline/depend: Ditto.
-
-	* ext/ripper/depend: Ditto.
-
-	* ext/sdbm/depend: Ditto.
-
-	* ext/socket/depend: Ditto.
-
-	* ext/stringio/depend: Ditto.
-
-	* ext/strscan/depend: Ditto.
-
-	* ext/syslog/depend: Ditto.
-
-	* ext/-test-/num2int/depend: Removed.
-
-	* ext/dbm/depend: Ditto.
-
-	* ext/fcntl/depend: Ditto.
-
-	* ext/gdbm/depend: Ditto.
-
-	* ext/racc/cparse/depend: Ditto.
-
-Sat Apr 13 00:15:54 2013  Nobuyoshi Nakada  <nobu@r...>
-
-	* ext/etc/etc.c (Init_etc): move Passwd and Group under Etc namespace
-	  as primary names.
-
-Fri Apr 12 21:06:55 2013  Tanaka Akira  <akr@f...>
-
-	* common.mk: pack.o depends on internal.h.
-
-Fri Apr 12 20:59:24 2013  Tanaka Akira  <akr@f...>
-
-	* bignum.c (ones): Use __builtin_popcountl if available.
-
-	* internal.h (GCC_VERSION_SINCE): Macro moved from pack.c.
-
-	* pack.c: Include internal.h for GCC_VERSION_SINCE.
-
-Fri Apr 12 18:29:42 2013  Tanaka Akira  <akr@f...>
-
-	* common.mk: version.o depends on $(srcdir)/include/ruby/version.h
-	  instead of {$(VPATH)}version.h to avoid confusion by VPATH between
-	  top level version.h and include/ruby/version.h for build in-place.
-	  [ruby-dev:47249] [Bug #8256]
-
-Fri Apr 12 15:21:24 2013  Nobuyoshi Nakada  <nobu@r...>
-
-	* vm_insnhelper.c (vm_callee_setup_keyword_arg): non-symbol key is not
-	  a keyword argument, keep it as an positional argument.
-
-Fri Apr 12 11:58:00 2013  Zachary Scott  <zachary@z...>
-
-	* array.c: Document synonymous methods, by windwiny [GH-277]
-	* bignum.c: ditto
-	* complex.c: ditto
-	* dir.c: ditto
-	* encoding.c: ditto
-	* enumerator.c: ditto
-	* numeric.c: ditto
-	* proc.c: ditto
-	* re.c: ditto
-	* string.c: ditto
-
-Thu Apr 11 23:41:46 2013  Tanaka Akira  <akr@f...>
-
-	* common.mk: Add dependencies for include/ruby.h
-
-	* tool/update-deps: Use "make -p all miniruby ruby golf" to extract
-	  dependencies in makefiles.
-
-Thu Apr 11 23:21:17 2013  Tanaka Akira  <akr@f...>
-
-	* tool/update-deps: Use "make -p all golf" to extract dependencies in
-	  makefiles.
-
-Thu Apr 11 21:02:19 2013  Tanaka Akira  <akr@f...>
-
-	* common.mk: Dependency updated.
-
-	* tool/update-deps: Rewritten.
-
-Thu Apr 11 19:59:48 2013  NARUSE, Yui  <naruse@r...>
-
-	* common.mk: partially revert r40183, which breaks building on
-	  other than source directory. (its commit log also says the same
-	  thing, but such failure is not reproducible on my environment
-	  and the commit breaks build on my environment)
-
-Thu Apr 11 16:10:01 2013  NARUSE, Yui  <naruse@r...>
-
-	* ext/fiddle/closure.c (USE_FFI_CLOSURE_ALLOC): define 0 on
-	  Mac OS X and Linux [Bug #3371]
-
-Thu Apr 11 13:19:22 2013  NAKAMURA Usaku  <usa@r...>
-
-	* test/drb/drbtest.rb (Drb{Core,Ary}#teardown): retry Process.kill
-	  if it fails with Errno::EPERM on Windows (workaround).
-	  [ruby-dev:47245] [Bug #8251]
-
-Thu Apr 11 11:11:38 2013  Akinori MUSHA  <knu@i...>
-
-	* dir.c: Fix a typo.
-
-Thu Apr 11 10:39:34 2013  NARUSE, Yui  <naruse@r...>
-
-	* ext/fiddle/closure.c (USE_FFI_CLOSURE_ALLOC): add missing case:
-	  RUBY_LIBFFI_MODVERSION is not defined (usually on Windows).
-
-Thu Apr 11 09:27:04 2013  Konstantin Haase  <me@r...>
-
-	* dir.c (file_s_fnmatch): Document File::FNM_EXTGLOB flag.
-
-Thu Apr 11 09:17:00 2013  Zachary Scott  <zachary@z...>
-
-	* README: Fix typo by Benjamin Winkler [Fixes GH-281]
-
-Thu Apr 11 06:15:51 2013  NARUSE, Yui  <naruse@r...>
-
-	* regint.h: fix typo: _M_AMD86 -> _M_AMD64.
-
-	* siphash.c: ditto.
-
-	* st.c: ditto.
-
-Thu Apr 11 06:09:57 2013  NARUSE, Yui  <naruse@r...>
-
-	* ext/fiddle/extconf.rb: define RUBY_LIBFFI_MODVERSION macro.
-
-	* ext/fiddle/closure.c (USE_FFI_CLOSURE_ALLOC): define 0 or 1
-	  with platform and libffi's version. [Bug #3371]
-
-Thu Apr 11 05:30:43 2013  NARUSE, Yui  <naruse@r...>
-
-	* lib/mkmf.rb (pkg_config): Add optional argument "option".
-	  If it is given, it returns the result of
-	  `pkg-config --<option> <pkgname>`.
-
-Thu Apr 11 03:33:05 2013  NARUSE, Yui  <naruse@r...>
-
-	* ext/fiddle/closure.c (initialize): check mprotect's return value.
-	  If mprotect is failed because of PaX or something, its function call
-	  will cause SEGV.
-	  http://c5664.rubyci.org/~chkbuild/ruby-trunk/log/20130401T210301Z.diff.html.gz
-
-Wed Apr 10 17:39:13 2013  Tanaka Akira  <akr@f...>
-
-	* ext/bigdecimal/bigdecimal.c (VpCtoV): Initialize a local variable
-	  even when overflow.
-
-Wed Apr 10 12:32:37 2013  Tanaka Akira  <akr@f...>
-
-	* bignum.c (rb_ll2big): Don't overflow on signed integer negation.
-
-	* ext/bigdecimal/bigdecimal.c (MUL_OVERFLOW_SIGNED_VALUE_P): New
-	  macro.
-	  (AddExponent): Don't overflow on signed integer multiplication.
-	  (VpCtoV): Don't overflow on signed integer arithmetic.
-	  (VpCtoV): Don't overflow on signed integer arithmetic.
-
-Wed Apr 10 06:32:12 2013  Tanaka Akira  <akr@f...>
-
-	* internal.h (MUL_OVERFLOW_INT_P): New macro.
-
-	* sprintf.c (GETNUM): Don't overflow on signed integer multiplication.
-
-Tue Apr  9 20:38:20 2013  Tanaka Akira  <akr@f...>
-
-	* internal.h (MUL_OVERFLOW_SIGNED_INTEGER_P): New macro.
-	  (MUL_OVERFLOW_FIXNUM_P): Ditto.
-	  (MUL_OVERFLOW_LONG_P): Ditto.
-
-	* array.c (rb_ary_product): Don't overflow on signed integer
-	  multiplication.
-
-	* numeric.c (fix_mul): Ditto.
-	  (int_pow): Ditto.
-
-	* rational.c (f_imul): Ditto.
-
-	* insns.def (opt_mult): Ditto.
-
-	* thread.c (sleep_timeval): Don't overflow on signed integer addition.
-
-	* bignum.c (rb_int2big): Don't overflow on signed integer negation.
-	  (rb_big2ulong): Ditto.
-	  (rb_big2long): Ditto.
-	  (rb_big2ull): Ditto.
-	  (rb_big2ll): Ditto.
+	  make_struct() for each purpose.
 
 Tue Apr  9 19:45:44 2013  Tanaka Akira  <akr@f...>
 
@@ -248,27 +26,27 @@ Tue Apr  9 10:02:39 2013  Nobuyoshi Naka https://github.com/ruby/ruby/blob/trunk/ChangeLog#L26
 
 Tue Apr  9 04:57:59 JST 2013  Charles Oliver Nutter  <headius@h...>
 
-	* error.c: Capture EAGAIN, EWOULDBLOCK, EINPROGRESS exceptions and
+	* error.c: Capture EGAIN, EWOULDBLOCK, EINPROGRESS exceptions and
 	  export them for use in WaitReadable/Writable exceptions.
 	* io.c: Create versions of EAGAIN, EWOULDBLOCK, EINPROGRESS that
-	  include WaitReadable and WaitWritable. Add rb_readwrite_sys_fail
+          include WaitReadable and WaitWritable. Add rb_readwrite_sys_fail
 	  for nonblocking failures using those exceptions. Use that
 	  function in io_getpartial and io_write_nonblock instead of
 	  rb_mod_sys_fail
-	* ext/openssl/ossl_ssl.c: Add new SSLError subclasses that include
+        * ext/openssl/ossl_ssl.c: Add new SSLError subclasses that include
 	  WaitReadable and WaitWritable. Use those classes for
 	  write_would_block and read_would_block instead of rb_mod_sys_fail.
 	* ext/socket/ancdata.c: Use rb_readwrite_sys_fail instead of
 	  rb_mod_sys_fail in bsock_sendmsg_internal and
 	  bsock_recvmsg_internal.
-	* ext/socket/init.c: Use rb_readwrite_sys_fail instead of
+        * ext/socket/init.c: Use rb_readwrite_sys_fail instead of
 	  rb_mod_sys_fail in rsock_s_recvfrom_nonblock and
-	  rsock_s_connect_nonblock.
-	* ext/socket/socket.c: Use rb_readwrite_sys_fail instead of
-	  rb_mod_sys_fail in sock_connect_nonblock.
+          rsock_s_connect_nonblock.
+        * ext/socket/socket.c: Use rb_readwrite_sys_fail instead of
+          rb_mod_sys_fail in sock_connect_nonblock.
 	* include/ruby/ruby.h: Export rb_readwrite_sys_fail for use instead
 	  of rb_mod_sys_fail. Introduce new constants RB_IO_WAIT_READABLE and
-	  RB_IO_WAIT_WRITABLE for first arg to rb_readwrite_sys_fail.
+          RB_IO_WAIT_WRITABLE for first arg to rb_readwrite_sys_fail.
 
 Tue Apr  9 02:44:32 2013  Nobuyoshi Nakada  <nobu@r...>
 
Index: struct.c
===================================================================
--- struct.c	(revision 40268)
+++ struct.c	(revision 40269)
@@ -172,32 +172,41 @@ rb_struct_set(VALUE obj, VALUE val) https://github.com/ruby/ruby/blob/trunk/struct.c#L172
 }
 
 static VALUE
-make_struct(VALUE name, VALUE members, VALUE klass)
+anonymous_struct(VALUE klass)
 {
-    VALUE nstr, *ptr_members;
+    VALUE nstr;
+
+    nstr = rb_class_new(klass);
+    rb_make_metaclass(nstr, RBASIC(klass)->klass);
+    rb_class_inherited(klass, nstr);
+    return nstr;
+}
+
+static VALUE
+new_struct(VALUE name, VALUE super)
+{
+    /* old style: should we warn? */
     ID id;
+    name = rb_str_to_str(name);
+    if (!rb_is_const_name(name)) {
+	rb_name_error_str(name, "identifier %"PRIsVALUE" needs to be constant",
+			  QUOTE(name));
+    }
+    id = rb_to_id(name);
+    if (rb_const_defined_at(super, id)) {
+	rb_warn("redefining constant Struct::%s", StringValuePtr(name));
+	rb_mod_remove_const(super, ID2SYM(id));
+    }
+    return rb_define_class_id_under(super, id, super);
+}
+
+static VALUE
+setup_struct(VALUE nstr, VALUE members)
+{
+    VALUE *ptr_members;
     long i, len;
 
     OBJ_FREEZE(members);
-    if (NIL_P(name)) {
-	nstr = rb_class_new(klass);
-	rb_make_metaclass(nstr, RBASIC(klass)->klass);
-	rb_class_inherited(klass, nstr);
-    }
-    else {
-	/* old style: should we warn? */
-	name = rb_str_to_str(name);
-	if (!rb_is_const_name(name)) {
-	    rb_name_error_str(name, "identifier %"PRIsVALUE" needs to be constant",
-			      QUOTE(name));
-	}
-	id = rb_to_id(name);
-	if (rb_const_defined_at(klass, id)) {
-	    rb_warn("redefining constant Struct::%s", StringValuePtr(name));
-	    rb_mod_remove_const(klass, ID2SYM(id));
-	}
-	nstr = rb_define_class_id_under(klass, id, klass);
-    }
     rb_ivar_set(nstr, id_members, members);
 
     rb_define_alloc_func(nstr, struct_alloc);
@@ -246,9 +255,7 @@ rb_struct_define_without_accessor(const https://github.com/ruby/ruby/blob/trunk/struct.c#L255
         klass = rb_define_class(class_name, super);
     }
     else {
-	klass = rb_class_new(super);
-	rb_make_metaclass(klass, RBASIC(super)->klass);
-	rb_class_inherited(super, klass);
+	klass = anonymous_struct(super);
     }
 
     rb_ivar_set(klass, id_members, members);
@@ -265,11 +272,9 @@ VALUE https://github.com/ruby/ruby/blob/trunk/struct.c#L272
 rb_struct_define(const char *name, ...)
 {
     va_list ar;
-    VALUE nm, ary;
+    VALUE st, ary;
     char *mem;
 
-    if (!name) nm = Qnil;
-    else nm = rb_str_new2(name);
     ary = rb_ary_new();
 
     va_start(ar, name);
@@ -279,7 +284,9 @@ rb_struct_define(const char *name, ...) https://github.com/ruby/ruby/blob/trunk/struct.c#L284
     }
     va_end(ar);
 
-    return make_struct(nm, ary, rb_cStruct);
+    if (!name) st = anonymous_struct(rb_cStruct);
+    else st = new_struct(rb_str_new2(name), rb_cStruct);
+    return setup_struct(st, ary);
 }
 
 /*
@@ -335,16 +342,28 @@ rb_struct_s_def(int argc, VALUE *argv, V https://github.com/ruby/ruby/blob/trunk/struct.c#L342
     VALUE st;
     ID id;
 
-    rb_scan_args(argc, argv, "1*", &name, &rest);
-    if (!NIL_P(name) && SYMBOL_P(name)) {
-	rb_ary_unshift(rest, name);
+    rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
+    name = argv[0];
+    if (SYMBOL_P(name)) {
 	name = Qnil;
     }
-    for (i=0; i<RARRAY_LEN(rest); i++) {
-	id = rb_to_id(RARRAY_PTR(rest)[i]);
+    else {
+	--argc;
+	++argv;
+    }
+    rest = rb_ary_new2(argc);
+    for (i=0; i<argc; i++) {
+	id = rb_to_id(argv[i]);
 	RARRAY_PTR(rest)[i] = ID2SYM(id);
+	rb_ary_set_len(rest, i+1);
+    }
+    if (NIL_P(name)) {
+	st = anonymous_struct(klass);
+    }
+    else {
+	st = new_struct(name, klass);
     }
-    st = make_struct(name, rest, klass);
+    setup_struct(st, rest);
     if (rb_block_given_p()) {
 	rb_mod_module_eval(0, 0, st);
     }

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

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